diff --git a/Loop Widget Extension/Bootstrap/Localizable.xcstrings b/Loop Widget Extension/Bootstrap/Localizable.xcstrings index ef9bff8e52..01eb6c4067 100644 --- a/Loop Widget Extension/Bootstrap/Localizable.xcstrings +++ b/Loop Widget Extension/Bootstrap/Localizable.xcstrings @@ -1,1600 +1,4746 @@ { "sourceLanguage" : "en", "strings" : { - " " : { - "comment" : "A space.", - "isCommentAutoGenerated" : true - }, - "---" : { + "%1$@ g" : { + "comment" : "Format string for an amount of carbohydrate in grams. (1: grams)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "--" + "value" : "%1$@ g" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ г" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ g" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "---" + "value" : "%1$@ gr" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ г" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 克" } } } }, - "-U" : { + "%1$@ U" : { + "comment" : "Reservoir entry (1: volume value)", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "-E" + "value" : "%1$@ وحدة" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "-IE" + "value" : "%1$@ U" } }, - "es" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "-U" + "value" : "%1$@ E" } }, - "fr" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "-U" + "value" : "%1$@ IE" } }, - "it" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "-U" + "value" : "%1$@ U" } }, - "nb" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "-E" + "value" : "%1$@ U" } }, - "nl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "-E" + "value" : "%1$@ U" } }, - "pl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "-J" + "value" : "U %1$@" } }, - "ro" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "-U" + "value" : "%1$@ U" } }, - "ru" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "-Ед" + "value" : "%1$@ U" } }, - "tr" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "-Ü" + "value" : "%1$@ 単位" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "-U" - } - } - } - }, - "??" : { - "extractionState" : "stale", - "localizations" : { - "da" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ E" } }, - "de" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ E" } }, - "es" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ J" } }, - "fr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ U" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ U" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ Ед." } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%@ j" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ E" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ Ü" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ U" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ U" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "??" + "value" : "%1$@ U" } } } }, - "%@" : { + "%1$@ U/h" : { + "comment" : "Format string for an insulin rate in units per hour. (1: rate)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ وحدة لكل ساعة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/hod" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ E/t" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ IE/Std" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ U/h" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ U/h" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ U/h" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "U/hr %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/óra" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ U/ora" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 単位/時" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ E/t" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ E/uur" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ J/h" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/h" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ U/oră" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ Ед/ч" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ J/hod" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ IE/h" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "%1$@ Ü/Sa" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/год" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/giờ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/小时" } } } }, - "%@ U" : { + "%1$@ · %2$@ in 5 min" : { + "comment" : "Under the glucose value on the Now screen: the glucose unit and how much glucose changed over 5 minutes. (1: glucose unit, e.g. mmol/L; 2: signed change, e.g. +0.3)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · %2$@ خلال ٥ دقائق" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · %2$@ za 5 min" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%@ E" + "value" : "%1$@ · %2$@ på 5 min" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%@ IE" + "value" : "%1$@ · %2$@ in 5 Min" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · %2$@ en 5 min" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · %2$@ / 5 min" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · %2$@ en 5 min" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · %2$@ ב-5 דק׳" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · %2$@ 5 perc alatt" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · %2$@ in 5 min" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · 5分で%2$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%@ E" + "value" : "%1$@ · %2$@ på 5 min" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%@ E" + "value" : "%1$@ · %2$@ in 5 min" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%@ J" + "value" : "%1$@ · %2$@ w 5 min" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · %2$@ em 5 min" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · %2$@ în 5 min" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%@ ед" + "value" : "%1$@ · %2$@ за 5 мин" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%@ j" + "value" : "%1$@ · %2$@ za 5 min" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%@ E" + "value" : "%1$@ · %2$@ på 5 min" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ Ü" + "value" : "%1$@ · 5 dk'da %2$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · %2$@ за 5 хв" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · %2$@ trong 5 phút" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U" + "value" : "%1$@ · 5分钟内%2$@" } } } }, - "%@%@" : { + " " : { + "comment" : "A space.", + "isCommentAutoGenerated" : true + }, + "---" : { "localizations" : { - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@" + "value" : "---" } }, - "en" : { + "de" : { "stringUnit" : { - "state" : "new", - "value" : "%1$@%2$@" + "state" : "translated", + "value" : "---" } }, - "fr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@" + "value" : "---" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "---" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "---" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "---" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "---" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "--" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "---" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "---" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "---" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "---" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "---" + } + } + } + }, + "-U" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "-E" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "-IE" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "-U" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "-U" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "-U" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "-E" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "-E" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "-J" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "-U" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "-Ед" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "-Ü" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "-U" + } + } + } + }, + "??" : { + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "??" + } + } + } + }, + "%@" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + } + } + }, + "%@ U" : { + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ E" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ IE" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ E" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ E" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ J" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ ед" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ j" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ E" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Ü" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U" + } + } + } + }, + "%@%@" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@%2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@" + } + } + } + }, + "%@U" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@IE" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@U" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@E" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@E" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@U" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@U" + } + } + } + }, + "%1$@ v%2$@" : { + "comment" : "The format string for the app name and version number. (1: bundle name)(2: bundle version)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ против %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + } + } + }, + "Add carbs" : { + "comment" : "Button on the Now screen that opens carb entry", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إضافة كارب" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Přidat sacharidy" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH hinzufügen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agregar carbohidratos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lisää hiilihydraatteja" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter des glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוספת פחמימות" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Szénhidrát hozzáadása" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi carboidrati" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "カーボを追加" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraten toevoegen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adicionar carbs" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить углеводы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pridať sacharidy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb ekle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Додати вуглеводи" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thêm Carbs" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加碳水" + } + } + } + }, + "Basal" : { + "comment" : "Chart callout label for the basal rate at the touched time Label of a tile showing the current basal rate (Now screen) or the day's basal insulin total (Today so far totals) Logbook filter chip: show only basal changes", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "القاعدية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazál" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaalinen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ベーサル" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaal" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podstawowy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazală" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazálna" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazal" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础" + } + } + } + }, + "Bolus" : { + "comment" : "Label for bolus entry row on bolus screen\nLabel for bolus entry row on simple bolus screen\nThe label of the bolus entry button\nTitle for bolus entry screen", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bólus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ボーラス" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюс" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюс" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大剂量" + } + } + } + }, + "Closed loop · %1$@" : { + "comment" : "Status pill on the Now screen: closed loop is on and Loop last ran this long ago. (1: duration, e.g. 3m)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حلقة مغلقة · %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavřená smyčka · %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop · %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop · %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circuito cerrado · %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö · %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle fermée · %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop · %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zárt hurok · %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso · %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クローズドループ · %1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop · %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop · %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla zamknięta · %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo fechado · %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă · %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл · %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavretá slučka · %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten loop · %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı döngü · %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутий цикл · %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp kín · %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环 · %1$@" + } + } + } + }, + "Closed loop · not run yet" : { + "comment" : "Status pill on the Now screen: closed loop is on but Loop has never completed", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حلقة مغلقة · لم يعمل بعد" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavřená smyčka · zatím neproběhla" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop · ikke kørt endnu" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop · noch nicht gelaufen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circuito cerrado · aún no se ha ejecutado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö · ei vielä ajettu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle fermée · pas encore exécuté" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop · טרם רץ" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zárt hurok · még nem futott" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso · non ancora eseguito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クローズドループ · 未実行" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop · ikke kjørt ennå" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop · nog niet gedraaid" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla zamknięta · jeszcze nie działała" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo fechado · ainda não executou" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă · nu a rulat încă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл · ещё не запускался" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavretá slučka · ešte neprebehla" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten loop · inte körd än" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı döngü · henüz çalışmadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутий цикл · ще не запускався" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp kín · chưa chạy" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环 · 尚未运行" + } + } + } + }, + "COB" : { + "comment" : "Abbreviation for carbs on board (active carbohydrate) Abbreviation for carbs on board; label of a tile on the Now screen", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "GA" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + } + } + }, + "Color" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Farbe" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Couleur" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Farge" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kleur" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Culoare" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "颜色" + } + } + } + }, + "Date" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Datum" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Date" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dato" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Datum" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dată" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "日期" + } + } + } + }, + "dB" : { + "comment" : "The short unit display string for decibles", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "дБ" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + } + } + }, + "End" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ende" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fin" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avslutt" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stop" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sfârșit" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "结束" + } + } + } + }, + "Eventual" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventuel" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventuell" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventual" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Éventuel" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "סופי" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventuale" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventuell" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uiteindelijk" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Możliwy" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventual" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "В конечном итоге" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nihai" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最终" + } + } + } + }, + "Eventually" : { + "comment" : "Short label above the glucose Loop predicts at the end of its prediction, in a small tile on the widget and Live Activity. Keep it to one short word, such as 'Forecast'.", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المتوقع" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predikce" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognose" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognose" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Previsión" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ennuste" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prévision" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "תחזית" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Várható" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Previsione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "予想" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognose" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognose" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognoza" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Previsão" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognoză" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прогноз" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predikcia" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognos" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tahmin" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прогноз" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dự báo" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "预测" + } + } + } + }, + "Eventually %1$@ %2$@" : { + "comment" : "Prediction card on the Now screen: Loop's eventual predicted glucose. (1: glucose value; 2: glucose unit, e.g. mmol/L)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "في النهاية %1$@ %2$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nakonec %1$@ %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Med tiden %1$@ %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voraussichtlich %1$@ %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Al final %1$@ %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ennuste %1$@ %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finalement %1$@ %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventually %1$@ %2$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Várható %1$@ %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infine %1$@ %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "予想 %1$@ %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Omsider %1$@ %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uiteindelijk %1$@ %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Docelowo %1$@ %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "No final %1$@ %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "În cele din urmă %1$@ %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "В конечном итоге %1$@ %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nakoniec %1$@ %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Förväntat %1$@ %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nihai KŞ %1$@ %2$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Зрештою %1$@ %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kết quả %1$@ %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最终 %1$@ %2$@" + } + } + } + }, + "g" : { + "comment" : "The short unit display string for grams", + "extractionState" : "stale", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "г" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "gr" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "克" + } + } + } + }, + "Glucose level" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blutzuckerspiegel" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Niveau de glycémie" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukosenivå" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosewaarde" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nivelul glicemiei" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖水平" + } + } + } + }, + "Glucose range" : { + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zielbereich" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plage de glycémie" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoseområde" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosebereik" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervalul glicemic" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖范围" + } + } + } + }, + "High" : { + "comment" : "Pill under the glucose value on the Now screen when glucose is above 250 mg/dL (13.9 mmol/L) Time in range band: glucose 181–250 mg/dL (10.1–13.9 mmol/L) Time-in-range band name: glucose 181–250 mg/dL (10.1–13.9 mmol/L)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مرتفع" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vysoká" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Høj" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hoch" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alta" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Korkea" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Élevée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "גבוה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Magas" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alta" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "高値" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Høy" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hoog" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wysoka" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alta" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ridicată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Высокая" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vysoká" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Högt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yüksek" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Висока" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cao" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "高" + } + } + } + }, + "Last reading %1$@ ago" : { + "comment" : "Shown on the Now screen under No reading when the latest CGM reading is too old. (1: duration, e.g. 25m)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "آخر قراءة قبل %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poslední hodnota před %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seneste måling for %1$@ siden" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Letzter Wert vor %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Última lectura hace %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Viimeisin lukema %1$@ sitten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dernière mesure il y a %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קריאה אחרונה לפני %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utolsó érték %1$@ ezelőtt" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ultima lettura %1$@ fa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "最終測定 %1$@前" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Siste måling for %1$@ siden" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laatste waarde %1$@ geleden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ostatni odczyt %1$@ temu" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Última leitura há %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ultima citire acum %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Последнее показание %1$@ назад" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posledná hodnota pred %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Senaste värde för %1$@ sedan" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Son okuma %1$@ önce" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Останній показник %1$@ тому" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chỉ số cuối cách đây %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最后读数在 %1$@前" + } + } + } + }, + "Loop hasn't run for %1$@" : { + "comment" : "Notice title on the Now screen when Loop hasn't completed recently. (1: duration since Loop last ran, e.g. 16m)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لم يعمل Loop منذ %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop neproběhl %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop har ikke kørt i %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop ist seit %1$@ nicht gelaufen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop no se ha ejecutado en %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loopia ei ole ajettu %1$@ aikana" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop ne s'est pas exécuté depuis %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop לא רץ כבר %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A Loop %1$@ óta nem futott" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop non eseguito da %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loopが%1$@実行されていません" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop har ikke kjørt på %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop heeft %1$@ niet gedraaid" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop nie działa od %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "O Loop não executa há %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop nu a rulat de %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop не запускался уже %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop neprebehol %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop har inte körts på %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop %1$@ süredir çalışmadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop не запускався вже %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop đã không chạy trong %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop 已 %1$@未运行" + } + } + } + }, + "Loop Status Widget" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Widget til loop-status" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop Status Widget" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Widget de Estado de Loop" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Widget d'état de Loop" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Widget di stato del ciclo" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@" + "value" : "Loop Status Widget" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@" + "value" : "Loop" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Widżet Stanu Pętli" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@" + "value" : "Widget de stare Loop" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Виджет состояния петли" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Döngü Durumu Widget'ı" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@" + "value" : "Loop 状态小组件" } } } }, - "%@U" : { + "Low" : { + "comment" : "Pill under the glucose value on the Now screen when glucose is below 70 mg/dL (3.9 mmol/L) Time in range band: glucose 54–69 mg/dL (3.0–3.8 mmol/L) Time-in-range band name: glucose 54–69 mg/dL (3.0–3.8 mmol/L)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "منخفض" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nízká" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lav" + } + }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%@IE" + "value" : "Niedrig" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baja" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Matala" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@U" + "value" : "Basse" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נמוך" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alacsony" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bassa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "低値" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%@E" + "value" : "Lav" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%@E" + "value" : "Laag" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Niska" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baixa" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%@U" + "value" : "Scăzută" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Низкая" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nízka" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lågt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Düşük" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Низька" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thấp" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%@U" + "value" : "低" } } } }, - "%1$@ v%2$@" : { - "comment" : "The format string for the app name and version number. (1: bundle name)(2: bundle version)", + "mg/dL" : { + "comment" : "The short unit display string for milligrams of glucose per decilter", + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v %2$@" + "value" : "mg/dL" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dl" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ против %2$@" + "value" : "мг/дл" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v %2$@" + "value" : "mg/dL" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dl" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "mg/dL" } } } }, - "Color" : { + "mmol/L" : { + "comment" : "The short unit display string for millimoles of glucose per liter", + "extractionState" : "stale", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "mmol/L" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "mmol/L" + } + }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Farbe" + "value" : "mmol/L" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "mmol/L" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "mmol/L" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Couleur" + "value" : "mmol/L" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "mmol/L" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "mmol/L" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "mmol/L" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Farge" + "value" : "mmol/L" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Kleur" + "value" : "mmol/L" } }, - "ro" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Culoare" + "value" : "mmol/L" } }, - "zh-Hans" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "颜色" + "value" : "mmol/L" } - } - } - }, - "Date" : { - "localizations" : { - "de" : { + }, + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Datum" + "value" : "mmol/L" } }, - "fr" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Date" + "value" : "mmol/L" } }, - "nb" : { + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "mmol/L" + } + }, + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Dato" + "value" : "mmol/L" } }, - "nl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Datum" + "value" : "mmol/L" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Dată" + "value" : "mmol/L" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "日期" + "value" : "mmol/L" } } } }, - "dB" : { - "comment" : "The short unit display string for decibles", + "No reading" : { + "comment" : "Shown on the Now screen in place of the glucose value when there is no recent CGM reading", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "لا توجد قراءة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žádná hodnota" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Ingen måling" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Kein Wert" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Sin lectura" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Ei lukemaa" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Aucune mesure" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "אין קריאה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs érték" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Nessuna lettura" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "測定値なし" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Ingen måling" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Geen waarde" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Brak odczytu" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Sem leitura" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Nicio citire" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "дБ" + "value" : "Нет показаний" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Žiadna hodnota" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Inget värde" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Okuma yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає показників" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Không có chỉ số" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "无读数" } } } }, - "End" : { + "Open loop · %1$@" : { + "comment" : "Status pill on the Now screen: closed loop is off (Loop recommends only) and Loop last ran this long ago. (1: duration, e.g. 3m)", "localizations" : { - "de" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Ende" + "value" : "حلقة مفتوحة · %1$@" } }, - "fr" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Fin" + "value" : "Otevřená smyčka · %1$@" } }, - "nb" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Avslutt" + "value" : "Åbent Loop · %1$@" } }, - "nl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Stop" + "value" : "Open Loop · %1$@" } }, - "ro" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Sfârșit" + "value" : "Circuito abierto · %1$@" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "结束" - } - } - } - }, - "Eventual" : { - "localizations" : { - "da" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Eventuel" + "value" : "Avoin säätö · %1$@" } }, - "de" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Eventuell" + "value" : "Boucle ouverte · %1$@" } }, - "es" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Eventual" + "value" : "Open Loop · %1$@" } }, - "fr" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Éventuel" + "value" : "Nyitott hurok · %1$@" } }, - "he" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "סופי" + "value" : "Loop aperto · %1$@" } }, - "it" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Eventuale" + "value" : "オープンループ · %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Eventuell" + "value" : "Åpen Loop · %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Uiteindelijk" + "value" : "Open loop · %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Możliwy" + "value" : "Pętla otwarta · %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo aberto · %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Eventual" + "value" : "Buclă deschisă · %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "В конечном итоге" + "value" : "Открытый цикл · %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otvorená slučka · %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Öppen loop · %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Nihai" + "value" : "Açık döngü · %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Відкритий цикл · %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp mở · %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "最终" + "value" : "开环 · %1$@" } } } }, - "g" : { - "comment" : "The short unit display string for grams", - "extractionState" : "stale", + "Open loop · not run yet" : { + "comment" : "Status pill on the Now screen: closed loop is off and Loop has never completed", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "حلقة مفتوحة · لم يعمل بعد" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otevřená smyčka · zatím neproběhla" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Åbent Loop · ikke kørt endnu" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Open Loop · noch nicht gelaufen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Circuito abierto · aún no se ha ejecutado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Avoin säätö · ei vielä ajettu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Boucle ouverte · pas encore exécuté" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Open Loop · טרם רץ" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nyitott hurok · még nem futott" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Loop aperto · non ancora eseguito" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "オープンループ · 未実行" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Åpen Loop · ikke kjørt ennå" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Open loop · nog niet gedraaid" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Pętla otwarta · jeszcze nie działała" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Ciclo aberto · ainda não executou" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Buclă deschisă · nu a rulat încă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "г" + "value" : "Открытый цикл · ещё не запускался" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Otvorená slučka · ešte neprebehla" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Öppen loop · inte körd än" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "gr" + "value" : "Açık döngü · henüz çalışmadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Відкритий цикл · ще не запускався" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Vòng lặp mở · chưa chạy" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "克" + "value" : "开环 · 尚未运行" } } } }, - "Glucose level" : { + "Open the app to update the widget" : { + "comment" : "No comment", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", - "value" : "Blutzuckerspiegel" + "value" : "Öffne die App, um das Widget zu aktualisieren" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Niveau de glycémie" + "value" : "Ouvrez l'application pour mettre à jour le widget" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Glukosenivå" + "value" : "Åpne appen for å oppdatere widgeten" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosewaarde" + "value" : "Open de app om de widget bij te werken" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nivelul glicemiei" + "value" : "Deschideți aplicația pentru a actualiza widgetul" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "血糖水平" + "value" : "打开应用以更新小部件" } } } }, - "Glucose range" : { + "Pre-meal" : { + "comment" : "Menu item under Presets on the Now screen that turns on the pre-meal target", "localizations" : { - "de" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Zielbereich" + "value" : "Pre-Meal" } }, - "fr" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Plage de glycémie" + "value" : "Před jídlem" } }, - "nb" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoseområde" + "value" : "Før-måltid" } }, - "nl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosebereik" + "value" : "Vor dem Essen" } }, - "ro" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Intervalul glicemic" + "value" : "Pre-comida" } }, - "zh-Hans" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "血糖范围" + "value" : "Ennen ateriaa" } - } - } - }, - "Loop Status Widget" : { - "localizations" : { - "da" : { + }, + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Widget til loop-status" + "value" : "Pré-repas" } }, - "de" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Loop Status Widget" + "value" : "Pre-Meal" } }, - "es" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Widget de Estado de Loop" + "value" : "Pre-Meal" } }, - "fr" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Widget d'état de Loop" + "value" : "Pre-pasto" } }, - "it" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Widget di stato del ciclo" + "value" : "食前" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loop Status Widget" + "value" : "Pre-måltid" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop" + "value" : "Voorafgaand aan maaltijd" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Widżet Stanu Pętli" + "value" : "Przed posiłkiem" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pré-refeição" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Widget de stare Loop" + "value" : "Înainte de masă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Виджет состояния петли" + "value" : "До еды" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pred jedlom" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Före måltid" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Döngü Durumu Widget'ı" + "value" : "Yemek öncesi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Перед їжою" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trước bữa ăn" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Loop 状态小组件" + "value" : "餐前" } } } }, - "mg/dL" : { - "comment" : "The short unit display string for milligrams of glucose per decilter", - "extractionState" : "stale", + "Pre-meal on" : { + "comment" : "Presets button title on the Now screen while the pre-meal target is on", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Pre-Meal مفعّل" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Před jídlem zapnuto" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Før-måltid til" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Vor dem Essen an" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Pre-comida activado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Ennen ateriaa päällä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Pré-repas activé" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pre-Meal פעיל" } }, - "he" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Pre-Meal bekapcsolva" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Pre-pasto attivo" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "食前 オン" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Pre-måltid på" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Voorafgaand aan maaltijd aan" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dl" + "value" : "Przed posiłkiem wł." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Pré-refeição ligado" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Înainte de masă activ" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "мг/дл" + "value" : "До еды вкл." } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Pred jedlom zapnuté" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dl" + "value" : "Före måltid på" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Yemek öncesi açık" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Перед їжою увімк." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Trước bữa ăn đang bật" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "餐前已开启" } } } }, - "mmol/L" : { - "comment" : "The short unit display string for millimoles of glucose per liter", - "extractionState" : "stale", + "Preset override" : { "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "mmol/L" - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "mmol/L" - } - }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Voreinstellung" } }, - "es" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Annulation du préréglage" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Forhåndsinnstilt overstyring" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Override-programma" } }, - "he" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Suprascriere presetată" } }, - "it" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "预设覆盖" } - }, - "ja" : { + } + } + }, + "Presets" : { + "comment" : "Button on the Now screen that opens override presets (and pre-meal); also its VoiceOver label and menu item", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "الإعدادات المسبقة" } }, - "nb" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Předvolby" } }, - "nl" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Forudindstillinger" } }, - "pl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Voreinstellungen" } }, - "pt-BR" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Ajustes preestablecidos" } }, - "ro" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Esiasetukset" } }, - "ru" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Préréglages" } }, - "sk" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "הגדרות מראש" } }, - "sv" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Előbeállítások" } }, - "tr" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Preimpostazioni" } }, - "vi" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "プリセット" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "mmol/L" - } - } - } - }, - "Open the app to update the widget" : { - "comment" : "No comment", - "localizations" : { - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Öffne die App, um das Widget zu aktualisieren" + "value" : "Forhåndsinnstillinger" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ouvrez l'application pour mettre à jour le widget" + "value" : "Programma's" } }, - "nb" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Åpne appen for å oppdatere widgeten" + "value" : "Ustawienia wstępne" } }, - "nl" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Open de app om de widget bij te werken" + "value" : "Predefinições" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Deschideți aplicația pentru a actualiza widgetul" + "value" : "Presetări" } }, - "zh-Hans" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "打开应用以更新小部件" + "value" : "Пресеты" } - } - } - }, - "Preset override" : { - "localizations" : { - "de" : { + }, + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Voreinstellung" + "value" : "Predvoľby" } }, - "fr" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Annulation du préréglage" + "value" : "Förinställningar" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Forhåndsinnstilt overstyring" + "value" : "Ön Ayarlar" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Override-programma" + "value" : "Пресети" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Suprascriere presetată" + "value" : "Cài đặt sẵn" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "预设覆盖" + "value" : "预设" } } } @@ -1966,6 +5112,149 @@ } } } + }, + "Urgent low" : { + "comment" : "Pill under the glucose value on the Now screen when glucose is below 54 mg/dL (3.0 mmol/L)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "منخفض عاجل" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kriticky nízká" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akut lav" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dringend niedrig" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baja urgente" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vaarallisen matala" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basse urgente" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נמוך דחוף" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sürgősen alacsony" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bassa urgente" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "緊急低値" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akutt lav" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Urgent laag" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Krytycznie niska" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baixa urgente" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Urgent scăzută" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Опасно низкая" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kriticky nízka" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akut lågt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acil düşük" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Небезпечно низька" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thấp khẩn cấp" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "紧急低血糖" + } + } + } } }, "version" : "1.1" diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/accent-ink.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/accent-ink.colorset/Contents.json new file mode 100644 index 0000000000..af109ce19a --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/accent-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.384", + "blue": "0.800", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.039", + "green": "0.518", + "blue": "1.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/accent.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/accent.colorset/Contents.json new file mode 100644 index 0000000000..9b711cb95b --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/accent.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemBlueColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/agp-inner.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/agp-inner.colorset/Contents.json new file mode 100644 index 0000000000..2ddc0f5f90 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/agp-inner.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.690", + "blue": "1.000", + "alpha": "0.340" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.729", + "blue": "1.000", + "alpha": "0.380" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/agp-outer.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/agp-outer.colorset/Contents.json new file mode 100644 index 0000000000..270771d475 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/agp-outer.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.690", + "blue": "1.000", + "alpha": "0.160" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.729", + "blue": "1.000", + "alpha": "0.180" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/basal-edge.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/basal-edge.colorset/Contents.json new file mode 100644 index 0000000000..fa72f9b84c --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/basal-edge.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.890", + "green": "0.725", + "blue": "0.514", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.431", + "green": "0.322", + "blue": "0.196", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/basal.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/basal.colorset/Contents.json new file mode 100644 index 0000000000..76f27a3287 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/basal.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.988", + "green": "0.890", + "blue": "0.761", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.263", + "green": "0.188", + "blue": "0.106", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.colorset/Contents.json new file mode 100644 index 0000000000..30b11e52a8 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/bolus.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.663", + "green": "0.282", + "blue": "0.039", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.639", + "blue": "0.278", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/carbs-ink.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/carbs-ink.colorset/Contents.json new file mode 100644 index 0000000000..df21da3860 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/carbs-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.184", + "green": "0.490", + "blue": "0.086", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.349", + "green": "0.894", + "blue": "0.200", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.colorset/Contents.json new file mode 100644 index 0000000000..5d023a96b0 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/carbs.colorset/Contents.json @@ -0,0 +1,68 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.220", + "green" : "0.855", + "red" : "0.388" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.200", + "green" : "0.894", + "red" : "0.349" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "contrast", + "value" : "high" + } + ], + "color" : { + "platform" : "ios", + "reference" : "systemGreenColor" + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + }, + { + "appearance" : "contrast", + "value" : "high" + } + ], + "color" : { + "platform" : "ios", + "reference" : "systemGreenColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/control-thumb.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/control-thumb.colorset/Contents.json new file mode 100644 index 0000000000..34b15edebe --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/control-thumb.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "1.000", + "blue": "1.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.388", + "blue": "0.400", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/critical-ink.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/critical-ink.colorset/Contents.json new file mode 100644 index 0000000000..2f18c32cc1 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/critical-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.769", + "green": "0.188", + "blue": "0.169", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.412", + "blue": "0.380", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/glucose-ink.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/glucose-ink.colorset/Contents.json new file mode 100644 index 0000000000..b704d8af81 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/glucose-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.439", + "blue": "0.722", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.729", + "blue": "1.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/ink-muted.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/ink-muted.colorset/Contents.json new file mode 100644 index 0000000000..6eda3190f3 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/ink-muted.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.424", + "green": "0.424", + "blue": "0.439", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.682", + "green": "0.682", + "blue": "0.698", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/insulin-ink.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/insulin-ink.colorset/Contents.json new file mode 100644 index 0000000000..1acea580ea --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/insulin-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.541", + "green": "0.227", + "blue": "0.024", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.639", + "blue": "0.278", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/range-high.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-high.colorset/Contents.json new file mode 100644 index 0000000000..28f578bf71 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-high.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.949", + "green": "0.718", + "blue": "0.020", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.839", + "blue": "0.039", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/range-in.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-in.colorset/Contents.json new file mode 100644 index 0000000000..3d0f452a75 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-in.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.184", + "green": "0.659", + "blue": "0.310", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.196", + "green": "0.843", + "blue": "0.294", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/range-low.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-low.colorset/Contents.json new file mode 100644 index 0000000000..1349d6a59e --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-low.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.898", + "green": "0.282", + "blue": "0.302", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.624", + "blue": "0.604", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/range-very-high.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-very-high.colorset/Contents.json new file mode 100644 index 0000000000..b2851438d1 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-very-high.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.541", + "green": "0.380", + "blue": "0.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.788", + "green": "0.541", + "blue": "0.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/range-very-low.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-very-low.colorset/Contents.json new file mode 100644 index 0000000000..46e9e70555 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/range-very-low.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.608", + "green": "0.110", + "blue": "0.122", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.271", + "blue": "0.227", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/status-critical.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/status-critical.colorset/Contents.json new file mode 100644 index 0000000000..9c67fd2db6 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/status-critical.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.231", + "blue": "0.188", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.271", + "blue": "0.227", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/DerivedAssetsBase.xcassets/target-band.colorset/Contents.json b/Loop Widget Extension/DerivedAssetsBase.xcassets/target-band.colorset/Contents.json new file mode 100644 index 0000000000..6ff45863c5 --- /dev/null +++ b/Loop Widget Extension/DerivedAssetsBase.xcassets/target-band.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.690", + "blue": "1.000", + "alpha": "0.140" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.729", + "blue": "1.000", + "alpha": "0.180" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop Widget Extension/Live Activity/GlucoseLiveActivityConfiguration.swift b/Loop Widget Extension/Live Activity/GlucoseLiveActivityConfiguration.swift index 314d0de950..8cd16518f7 100644 --- a/Loop Widget Extension/Live Activity/GlucoseLiveActivityConfiguration.swift +++ b/Loop Widget Extension/Live Activity/GlucoseLiveActivityConfiguration.swift @@ -46,6 +46,8 @@ struct GlucoseLiveActivityConfiguration: Widget { // banner on the Home Screen of devices that don't support the Dynamic Island. if #available(iOS 18.0, *) { AdaptiveLockScreenView(context: context) + } else if WidgetDesign.useRedesign { + RedesignLiveActivity.lockScreen(context) } else { fullLockScreenView(context: context) } @@ -57,7 +59,13 @@ struct GlucoseLiveActivityConfiguration: Widget { @Environment(\.activityFamily) private var activityFamily var body: some View { - if activityFamily == .small { + if WidgetDesign.useRedesign { + if activityFamily == .small { + RedesignLiveActivity.smallFamily(context) + } else { + RedesignLiveActivity.lockScreen(context) + } + } else if activityFamily == .small { // WatchOS & CarPlay supplemental view - show only bottom row compactLockScreenView(context: context) } else { @@ -262,6 +270,9 @@ struct GlucoseLiveActivityConfiguration: Widget { private func dynamicIslandView( context: ActivityViewContext ) -> DynamicIsland { + if WidgetDesign.useRedesign { + return RedesignLiveActivity.dynamicIsland(context) + } let glucoseFormatter = NumberFormatter.glucoseFormatter( for: context.state.isMmol ? LoopUnit.millimolesPerLiter : LoopUnit.milligramsPerDeciliter diff --git a/Loop Widget Extension/Redesign/RedesignLiveActivity.swift b/Loop Widget Extension/Redesign/RedesignLiveActivity.swift new file mode 100644 index 0000000000..00552fb96c --- /dev/null +++ b/Loop Widget Extension/Redesign/RedesignLiveActivity.swift @@ -0,0 +1,373 @@ +// +// RedesignLiveActivity.swift +// Loop Widget Extension +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import ActivityKit +import Charts +import HealthKit +import LoopCore +import LoopKit +import LoopAlgorithm +import SwiftUI +import WidgetKit + +/// The Live Activity in the redesign's style. It reads the same `GlucoseActivityAttributes` as the +/// classic one, so the Live Activity settings (chart, bottom row, limits) keep working. +@available(iOS 16.2, *) +enum RedesignLiveActivity { + typealias Context = ActivityViewContext + private typealias P = LoopDesign.Palette + + // MARK: - Shared pieces + + private static func unitName(_ context: Context) -> String { + (context.state.isMmol ? LoopUnit.millimolesPerLiter : LoopUnit.milligramsPerDeciliter).localizedShortUnitString + } + + private static func format(_ value: Double, _ context: Context) -> String { + NumberFormatter.glucoseFormatter(for: context.state.isMmol ? .millimolesPerLiter : .milligramsPerDeciliter).string(from: value) ?? "–" + } + + static func range(_ context: Context) -> WidgetDesign.Range? { + WidgetDesign.Range(context.state.currentGlucose, isMmol: context.state.isMmol) + } + + static func status(_ context: Context) -> WidgetDesign.LoopStatus { + WidgetDesign.LoopStatus(closedLoop: context.state.isCloseLoop, lastCompleted: context.state.lastCompleted) + } + + /// Low and high in words, otherwise the unit and the change, as under the Now screen's number. + @ViewBuilder + private static func detail(_ context: Context) -> some View { + if let range = range(context) { + HStack(spacing: LoopDesign.Space.s1) { + Circle().fill(range.color).frame(width: 7, height: 7) + Text(range.text) + } + .font(.caption.weight(.semibold)) + .foregroundStyle(P.ink) + } else { + Text(WidgetDesign.readingDetail(unit: unitName(context), delta: context.state.delta)) + .font(.caption) + .foregroundStyle(P.inkMuted) + .lineLimit(1) + .minimumScaleFactor(0.8) + } + } + + private static func eventually(_ context: Context) -> String? { + context.state.eventualGlucose.map { + String(format: NSLocalizedString("Eventually %1$@ %2$@", comment: "Header detail of the Next 3 hours card on the Now screen: the glucose Loop predicts at the end of its prediction. (1: glucose value; 2: glucose unit)"), format($0, context), unitName(context)) + } + } + + private static func hero(_ context: Context, size: CGFloat) -> some View { + VStack(alignment: .leading, spacing: 0) { + WidgetGlucoseValue(value: format(context.state.currentGlucose, context), trend: context.state.trendType, size: size) + detail(context) + } + } + + // MARK: - Lock Screen + + static func lockScreen(_ context: Context) -> some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s1) { + HStack(alignment: .top) { + hero(context, size: context.attributes.mode == .large ? 30 : 38) + Spacer(minLength: LoopDesign.Space.s2) + VStack(alignment: .trailing, spacing: 4) { + WidgetStatusLine(status: status(context)) + if let eventually = eventually(context) { + Text(eventually) + .font(.caption) + .foregroundStyle(P.inkMuted) + .lineLimit(1) + .minimumScaleFactor(0.8) + } + } + } + if context.attributes.mode == .large { + RedesignActivityChart(context: context) + .frame(height: 54) + } + let tiles = tileItems(context) + if !tiles.isEmpty { + HStack(spacing: 6) { + ForEach(tiles, id: \.self) { item in + tile(item, context, inline: context.attributes.mode == .large) + } + } + .padding(.top, 2) + } + } + .padding(.horizontal, 14) + .padding(.vertical, 10) + .overlay { + if context.state.ended { + Text(NSLocalizedString("Open the app to update the widget", comment: "No comment")) + .font(.subheadline.weight(.semibold)) + .foregroundStyle(P.ink) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(.ultraThinMaterial) + } + } + .privacySensitive() + .activityBackgroundTint(P.surfaceRaised.opacity(0.92)) + .activitySystemActionForegroundColor(P.ink) + } + + /// The watch and CarPlay size: the number, the change and the prediction. + static func smallFamily(_ context: Context) -> some View { + HStack(alignment: .center) { + hero(context, size: 26) + Spacer(minLength: LoopDesign.Space.s1) + VStack(alignment: .trailing, spacing: 2) { + Circle().fill(status(context).color).frame(width: 8, height: 8) + if let eventual = context.state.eventualGlucose { + Text(format(eventual, context)) + .font(.system(.headline, design: .rounded).weight(.semibold).monospacedDigit()) + .foregroundStyle(P.ink) + Text(NSLocalizedString("Eventually", comment: "Short label above the glucose Loop predicts at the end of its prediction, in a small tile on the widget and Live Activity. Keep it to one short word, such as 'Forecast'.")) + .font(.caption2) + .foregroundStyle(P.inkMuted) + } + } + } + .padding(LoopDesign.Space.s3) + .privacySensitive() + } + + /// The configured bottom row, less the reading and its change, which the hero already shows. + private static func tileItems(_ context: Context) -> [BottomRowItem] { + context.state.bottomRow.filter { item in + switch item.type { + case .currentBg: return false + case .generic: return item.value != context.state.delta || item.unit != "" + case .basal: return true + } + } + } + + @ViewBuilder + private static func tile(_ item: BottomRowItem, _ context: Context, inline: Bool) -> some View { + switch item.type { + case .basal: + WidgetTile(label: NSLocalizedString("Basal", comment: "Label of a tile showing the current basal rate (Now screen) or the day's basal insulin total (Today so far totals)"), inline: inline) { + Text(String(format: NSLocalizedString("%1$@ U/h", comment: "Insulin rate in units per hour. (1: number)"), WidgetDesign.signed(item.rate, decimals: 2))) + .foregroundStyle(P.insulinInk) + } + case .generic, .currentBg: + WidgetTile(label: item.label, inline: inline) { + switch item.unit { + case "U": + Text(String(format: NSLocalizedString("%1$@ U", comment: "Insulin amount in units. (1: number)"), item.value)) + .foregroundStyle(P.insulinInk) + case "g": + Text(String(format: NSLocalizedString("%1$@ g", comment: "Amount of carbohydrate in grams. (1: number)"), item.value)) + .foregroundStyle(P.carbsInk) + default: + Text(item.value) + .foregroundStyle(P.ink) + } + } + } + } + + // MARK: - Dynamic Island + + static func dynamicIsland(_ context: Context) -> DynamicIsland { + DynamicIsland { + DynamicIslandExpandedRegion(.leading) { + hero(context, size: 34) + .padding(.leading, LoopDesign.Space.s1) + .dynamicIsland(verticalPlacement: .belowIfTooWide) + } + // The trailing region is narrow, so it holds only the prediction, labelled like the widget's tile; + // Loop's status gets the full width above the chart, where long translations still fit. + DynamicIslandExpandedRegion(.trailing) { + if let eventual = context.state.eventualGlucose { + VStack(alignment: .trailing, spacing: 0) { + Text(NSLocalizedString("Eventually", comment: "Short label above the glucose Loop predicts at the end of its prediction, in a small tile on the widget and Live Activity. Keep it to one short word, such as 'Forecast'.")) + .font(.caption2) + .foregroundStyle(P.inkMuted) + .lineLimit(1) + .minimumScaleFactor(0.7) + Text(format(eventual, context)) + .font(.system(.title3, design: .rounded).weight(.semibold).monospacedDigit()) + .foregroundStyle(P.ink) + } + .padding(.trailing, LoopDesign.Space.s1) + .padding(.top, LoopDesign.Space.s1) + } + } + DynamicIslandExpandedRegion(.bottom) { + VStack(alignment: .leading, spacing: LoopDesign.Space.s1) { + WidgetStatusLine(status: status(context), font: .caption.weight(.medium)) + RedesignActivityChart(context: context) + .frame(height: 46) + } + .padding(.horizontal, LoopDesign.Space.s1) + } + } compactLeading: { + HStack(spacing: 3) { + Text(format(context.state.currentGlucose, context)) + .font(.system(.body, design: .rounded).weight(.semibold).monospacedDigit()) + .foregroundStyle(.white) + .minimumScaleFactor(0.6) + if let trend = context.state.trendType { + Image(systemName: WidgetDesign.trendSymbol(trend)) + .font(.system(size: 11, weight: .bold)) + .foregroundStyle(P.glucose) + } + } + } compactTrailing: { + HStack(spacing: 4) { + if let range = range(context) { + Text(range.text) + .font(.caption.weight(.semibold)) + .foregroundStyle(range.color) + } else { + Text(context.state.delta) + .font(.system(.caption, design: .rounded).weight(.medium).monospacedDigit()) + .foregroundStyle(Color(white: 0.75)) + } + Circle().fill(status(context).color).frame(width: 6, height: 6) + } + .minimumScaleFactor(0.6) + } minimal: { + Text(format(context.state.currentGlucose, context)) + .font(.system(.caption, design: .rounded).weight(.semibold).monospacedDigit()) + .foregroundStyle(.white) + .minimumScaleFactor(0.5) + } + // The island's outline says low or high, so the number itself stays white. + .keylineTint(range(context)?.color ?? P.glucose) + } +} + +// MARK: - Chart + +/// The Now screen's prediction chart, sized for the Live Activity: blue readings, Loop's dashed +/// prediction and the target band. +@available(iOS 16.2, *) +struct RedesignActivityChart: View { + let context: ActivityViewContext + private typealias P = LoopDesign.Palette + + private var lowerLimit: Double { + context.state.isMmol ? context.attributes.lowerLimitChartMmol : context.attributes.lowerLimitChartMg + } + + private var upperLimit: Double { + context.state.isMmol ? context.attributes.upperLimitChartMmol : context.attributes.upperLimitChartMg + } + + /// With "use limits" on, readings outside them take the Trends range colours; the rest stay blue. + private func color(_ value: Double) -> Color { + guard context.attributes.useLimits else { return P.glucose } + if value < lowerLimit { return P.rangeLow } + if value > upperLimit { return P.rangeHigh } + return P.glucose + } + + private var prediction: [(Date, Double)] { + guard context.attributes.addPredictiveLine, let start = context.state.predicatedStartDate else { return [] } + let interval = context.state.predicatedInterval ?? .minutes(5) + let end = start.addingTimeInterval(.hours(3)) + return context.state.predicatedGlucose.enumerated() + .map { (start.addingTimeInterval(interval * Double($0.offset)), $0.element) } + .filter { $0.0 <= end } + } + + private var domain: ClosedRange { + let marks = context.state.yAxisMarks + return (marks.first ?? 0)...(marks.last ?? 1) + } + + private func clamp(_ value: Double) -> Double { + min(max(value, domain.lowerBound), domain.upperBound) + } + + /// The readings Loop sent and its prediction, at least an hour ahead, as on the Now screen's chart. + private var window: ClosedRange { + let now = context.state.date + let start = min(context.state.glucoseSamples.first?.x ?? now.addingTimeInterval(.hours(-3)), now.addingTimeInterval(.hours(-1))) + let end = max(prediction.last?.0 ?? now, now.addingTimeInterval(.hours(1))) + return start...end + } + + var body: some View { + Chart { + ForEach(context.state.glucoseRanges.filter { $0.endDate > window.lowerBound && $0.startDate < window.upperBound }) { band in + RectangleMark(xStart: .value("Start", max(band.startDate, window.lowerBound)), xEnd: .value("End", min(band.endDate, window.upperBound)), + yStart: .value("Low", clamp(band.minValue)), yEnd: .value("High", clamp(max(band.maxValue, band.minValue + domainPadding)))) + .foregroundStyle(band.isOverride ? P.accent.opacity(0.25) : P.targetBand) + } + ForEach(Array(context.state.glucoseSamples.enumerated()), id: \.offset) { _, sample in + PointMark(x: .value("Time", sample.x), y: .value("Glucose", clamp(sample.y))) + .symbolSize(9) + .foregroundStyle(color(sample.y)) + } + ForEach(Array(prediction.enumerated()), id: \.offset) { _, point in + LineMark(x: .value("Time", point.0), y: .value("Predicted", clamp(point.1)), series: .value("Series", "prediction")) + .foregroundStyle(P.glucose) + .lineStyle(StrokeStyle(lineWidth: 1.5, dash: [4, 3])) + } + RuleMark(x: .value("Now", context.state.date)) + .foregroundStyle(P.inkMuted) + .lineStyle(StrokeStyle(lineWidth: 1, dash: [2, 3])) + } + .chartXScale(domain: window) + .chartYScale(domain: domain) + .chartYAxis { + AxisMarks(position: .leading, values: axisLabels) { _ in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel().font(LoopDesign.Typeface.caption).foregroundStyle(P.inkMuted) + } + } + .chartXAxis { + AxisMarks(values: hourMarks) { _ in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel(format: .dateTime.hour()).font(LoopDesign.Typeface.caption).foregroundStyle(P.inkMuted) + } + } + .chartLegend(.hidden) + .overlay(alignment: .topTrailing) { + if let preset = context.state.preset, preset.endDate > context.state.date { + Text(preset.title) + .font(.caption2.weight(.semibold)) + .foregroundStyle(P.ink) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background(P.accent.opacity(0.25), in: Capsule()) + } + } + .accessibilityHidden(true) + } + + /// Whole hours inside the window, kept clear of the edges so their labels aren't clipped. + private var hourMarks: [Date] { + let calendar = Calendar.current + guard var hour = calendar.dateInterval(of: .hour, for: window.lowerBound)?.end else { return [] } + var marks: [Date] = [] + while hour <= window.upperBound.addingTimeInterval(.minutes(-25)) { + if hour >= window.lowerBound.addingTimeInterval(.minutes(12)) { marks.append(hour) } + hour = hour.addingTimeInterval(.hours(1)) + } + return marks + } + + /// Every other value Loop suggests, so labels don't crowd a chart this short. + private var axisLabels: [Double] { + let marks = context.state.yAxisMarks + return marks.count > 3 ? marks.enumerated().filter { $0.offset % 2 == 0 }.map(\.element) : marks + } + + /// A single-value target is drawn as a thin band, so it stays visible. + private var domainPadding: Double { + (domain.upperBound - domain.lowerBound) / 60 + } +} diff --git a/Loop Widget Extension/Redesign/RedesignStatusWidgetView.swift b/Loop Widget Extension/Redesign/RedesignStatusWidgetView.swift new file mode 100644 index 0000000000..4b788f493d --- /dev/null +++ b/Loop Widget Extension/Redesign/RedesignStatusWidgetView.swift @@ -0,0 +1,173 @@ +// +// RedesignStatusWidgetView.swift +// Loop Widget Extension +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import HealthKit +import LoopCore +import LoopKit +import LoopAlgorithm +import SwiftUI +import WidgetKit + +/// The home screen widget in the redesign's style: the Now screen's hero on the left, and in the medium +/// size the Now screen's actions on the right. +struct RedesignStatusWidgetView: View { + @Environment(\.widgetFamily) private var family + @Environment(\.widgetRenderingMode) private var renderingMode + + let entry: StatusWidgetTimelimeEntry + + private typealias P = LoopDesign.Palette + + var body: some View { + HStack(spacing: LoopDesign.Space.s3) { + status + if family != .systemSmall { + actions + } + } + .padding(LoopDesign.Space.s3) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .redesignWidgetBackground(renderingMode == .accented ? .clear : P.surfaceRaised) + } + + // MARK: - Status + + private var status: some View { + VStack(alignment: .leading, spacing: 0) { + WidgetStatusLine(status: WidgetDesign.LoopStatus(closedLoop: entry.closeLoop, lastCompleted: entry.lastLoopCompleted, now: entry.date)) + .opacity(entry.contextIsStale ? 0.6 : 1) + Spacer(minLength: LoopDesign.Space.s1) + reading + Spacer(minLength: LoopDesign.Space.s2) + footer + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading) + } + + @ViewBuilder + private var reading: some View { + if let glucose = entry.currentGlucose, let unit = entry.unit, !entry.glucoseIsStale { + let value = glucose.quantity.doubleValue(for: unit) + VStack(alignment: .leading, spacing: 0) { + WidgetGlucoseValue( + value: NumberFormatter.glucoseFormatter(for: unit).string(from: value) ?? "–", + trend: entry.sensor?.trendType, + size: 40 + ) + if let range = WidgetDesign.Range(mgdl: glucose.quantity.doubleValue(for: .milligramsPerDeciliter)) { + HStack(spacing: LoopDesign.Space.s1) { + Circle().fill(range.color).frame(width: 7, height: 7) + Text(range.text) + } + .font(.caption.weight(.semibold)) + .foregroundStyle(P.ink) + } else { + Text(WidgetDesign.readingDetail(unit: unit.localizedShortUnitString, delta: delta(in: unit))) + .font(.caption) + .foregroundStyle(P.inkMuted) + .lineLimit(1) + .minimumScaleFactor(0.8) + } + } + .opacity(entry.glucoseStatusIsStale ? 0.6 : 1) + } else { + VStack(alignment: .leading, spacing: 2) { + Text(NSLocalizedString("No reading", comment: "Shown on the Now screen in place of the glucose value when there is no recent CGM reading")) + .font(.system(size: 22, weight: .bold, design: .rounded)) + .foregroundStyle(P.inkMuted) + .lineLimit(1) + .minimumScaleFactor(0.7) + if let date = entry.currentGlucose?.startDate { + Text(String(format: NSLocalizedString("Last reading %1$@ ago", comment: "Shown on the Now screen under No reading when the latest CGM reading is too old. (1: duration, e.g. 25m)"), WidgetDesign.duration(entry.date.timeIntervalSince(date)))) + .font(.caption) + .foregroundStyle(P.inkMuted) + .lineLimit(1) + .minimumScaleFactor(0.8) + } + } + } + } + + private func delta(in unit: LoopUnit) -> String? { + guard let delta = entry.delta else { return nil } + return WidgetDesign.signed(delta.doubleValue(for: unit), decimals: unit == .millimolesPerLiter ? 1 : 0) + } + + /// A device problem replaces the tiles, as notices lead the Now screen. + @ViewBuilder + private var footer: some View { + if let notice = WidgetNotice.mostSerious([entry.pumpHighlight, entry.cgmHighlight]) { + notice + } else { + HStack(spacing: 6) { + WidgetTile(label: NSLocalizedString("COB", comment: "Abbreviation for carbs on board; label of a tile on the Now screen")) { + Text(entry.carbsOnBoard.map { String(format: NSLocalizedString("%1$@ g", comment: "Amount of carbohydrate in grams. (1: number)"), Self.number($0, decimals: 0)) } ?? "–") + .foregroundStyle(P.carbsInk) + } + WidgetTile(label: NSLocalizedString("Eventually", comment: "Short label above the glucose Loop predicts at the end of its prediction, in a small tile on the widget and Live Activity. Keep it to one short word, such as 'Forecast'.")) { + Text(eventual ?? "–") + .foregroundStyle(P.ink) + } + } + .opacity(entry.contextIsStale ? 0.6 : 1) + } + } + + private var eventual: String? { + guard let eventual = entry.eventualGlucose else { return nil } + return NumberFormatter.glucoseFormatter(for: eventual.unit).string(from: eventual.quantity.doubleValue(for: eventual.unit)) + } + + static func number(_ value: Double, decimals: Int) -> String { + value.formatted(.number.precision(.fractionLength(decimals))) + } + + // MARK: - Actions + + private var actions: some View { + VStack(spacing: 6) { + HStack(spacing: 6) { + action(.carbEntry(nil), NSLocalizedString("Add carbs", comment: "Button on the Now screen that opens carb entry"), "fork.knife", fill: P.carbs, ink: P.onFill) + action(.bolus, NSLocalizedString("Bolus", comment: "Button on the Now screen that opens the bolus screen"), "syringe.fill", fill: P.insulin, ink: P.onFill) + } + HStack(spacing: 6) { + if entry.preMealPresetAllowed { + action(.preMeal, + entry.preMealPresetActive + ? NSLocalizedString("Pre-meal on", comment: "Presets button title on the Now screen while the pre-meal target is on") + : NSLocalizedString("Pre-meal", comment: "Menu item under Presets on the Now screen that turns on the pre-meal target"), + "fork.knife.circle", + fill: entry.preMealPresetActive ? P.accent.opacity(0.18) : WidgetDesign.sunken, ink: P.ink) + } + action(.customPresets, NSLocalizedString("Presets", comment: "Button on the Now screen that opens override presets (and pre-meal); also its VoiceOver label and menu item"), "slider.horizontal.3", + fill: entry.customPresetActive ? P.accent.opacity(0.18) : WidgetDesign.sunken, ink: P.ink) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + + private func action(_ destination: Deeplink, _ title: String, _ symbol: String, fill: Color, ink: Color) -> some View { + Link(destination: URL(string: "loop://\(destination.host.rawValue)")!) { + VStack(alignment: .leading, spacing: 2) { + Image(systemName: symbol) + .font(.system(size: 15, weight: .semibold)) + Spacer(minLength: 0) + Text(title) + .font(.footnote.weight(.semibold)) + .lineLimit(2) + .minimumScaleFactor(0.7) + } + .foregroundStyle(renderingMode == .accented ? P.ink : ink) + .padding(LoopDesign.Space.s2) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading) + .background( + renderingMode == .accented ? AnyShapeStyle(.white.opacity(0.12)) : AnyShapeStyle(fill), + in: RoundedRectangle(cornerRadius: LoopDesign.Radius.md, style: .continuous) + ) + } + } +} diff --git a/Loop Widget Extension/Redesign/WidgetDesign.swift b/Loop Widget Extension/Redesign/WidgetDesign.swift new file mode 100644 index 0000000000..1dd3fd4b40 --- /dev/null +++ b/Loop Widget Extension/Redesign/WidgetDesign.swift @@ -0,0 +1,250 @@ +// +// WidgetDesign.swift +// Loop Widget Extension +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import HealthKit +import LoopCore +import LoopKit +import SwiftUI + +/// The redesign's rules for the widget and Live Activity, so they read like the Now screen: the glucose +/// number is never tinted, low and high are said in words, and Loop's state is a dot with words. +enum WidgetDesign { + /// The tile fill. The app's sunken grey disappears against a dark home screen widget, so the + /// widget uses a translucent ink that reads on both light and dark. + static let sunken = LoopDesign.Palette.ink.opacity(0.08) + + /// Matches the app's interface setting, which the app mirrors into the app group. + static var useRedesign: Bool { UserDefaults.appGroup?.redesignEnabled ?? true } + + static func trendSymbol(_ trend: GlucoseTrend) -> String { + switch trend { + case .upUpUp: return "arrow.up.to.line" + case .upUp: return "chevron.up.2" + case .up: return "arrow.up" + case .flat: return "arrow.right" + case .down: return "arrow.down" + case .downDown: return "chevron.down.2" + case .downDownDown: return "arrow.down.to.line" + } + } + + enum Range { + case urgentLow, low, high + + /// The Now screen's thresholds: below 54 and 70 mg/dL, above 250 mg/dL. + init?(mgdl: Double) { + switch mgdl { + case ..<54: self = .urgentLow + case ..<70: self = .low + case 250.0.nextUp...: self = .high + default: return nil + } + } + + init?(_ value: Double, isMmol: Bool) { + let unit: HKUnit = isMmol ? .millimolesPerLiter : .milligramsPerDeciliter + self.init(mgdl: HKQuantity(unit: unit, doubleValue: value).doubleValue(for: .milligramsPerDeciliter)) + } + + var text: String { + switch self { + case .urgentLow: return NSLocalizedString("Urgent low", comment: "Pill under the glucose value on the Now screen when glucose is below 54 mg/dL (3.0 mmol/L)") + case .low: return NSLocalizedString("Low", comment: "Pill under the glucose value on the Now screen when glucose is below 70 mg/dL (3.9 mmol/L)") + case .high: return NSLocalizedString("High", comment: "Pill under the glucose value on the Now screen when glucose is above 250 mg/dL (13.9 mmol/L)") + } + } + + var color: Color { + self == .high ? LoopDesign.Palette.statusWarning : LoopDesign.Palette.statusCritical + } + } + + /// Loop's state as on the Now pill. The time of the last run stands in for the Now screen's age, + /// because a widget isn't redrawn every minute and an age would go stale on screen. + struct LoopStatus { + let text: String + let color: Color + + init(closedLoop: Bool, lastCompleted: Date?, now: Date = Date()) { + typealias P = LoopDesign.Palette + guard let lastCompleted else { + text = closedLoop + ? NSLocalizedString("Closed loop · not run yet", comment: "Status pill on the Now screen when closed loop is on but Loop hasn't completed a run yet") + : NSLocalizedString("Open loop · not run yet", comment: "Status pill on the Now screen when closed loop is off and Loop hasn't completed a run yet") + color = P.inkMuted + return + } + let age = max(0, now.timeIntervalSince(lastCompleted)) + if LoopCompletionFreshness(age: age) == .stale { + text = String(format: NSLocalizedString("Loop hasn't run for %1$@", comment: "Notice title on the Now screen when Loop hasn't completed a run recently. (1: duration, e.g. 25m)"), WidgetDesign.duration(age)) + color = P.statusWarning + return + } + let time = lastCompleted.formatted(date: .omitted, time: .shortened) + if closedLoop { + text = String(format: NSLocalizedString("Closed loop · %1$@", comment: "Status pill on the Now screen: closed loop is on. (1: how long ago Loop last ran, e.g. 2m)"), time) + color = LoopCompletionFreshness(age: age) == .fresh ? P.statusAutomated : P.statusWarning + } else { + text = String(format: NSLocalizedString("Open loop · %1$@", comment: "Status pill on the Now screen: closed loop is off. (1: how long ago Loop last ran, e.g. 2m)"), time) + color = P.inkMuted + } + } + } + + static func duration(_ interval: TimeInterval) -> String { + let formatter = DateComponentsFormatter() + formatter.unitsStyle = .abbreviated + formatter.allowedUnits = interval >= 3600 ? [.hour, .minute] : [.minute] + formatter.maximumUnitCount = 2 + return formatter.string(from: interval) ?? "" + } + + /// "mmol/L · +0.2 in 5 min", as under the number on the Now screen. + static func readingDetail(unit: String, delta: String?) -> String { + guard let delta, !delta.isEmpty else { return unit } + return String(format: NSLocalizedString("%1$@ · %2$@ in 5 min", comment: "Under the glucose value on the Now screen: the glucose unit and how much glucose changed over 5 minutes. (1: glucose unit, e.g. mmol/L; 2: signed change, e.g. +0.3)"), unit, delta) + } + + static func signed(_ value: Double, decimals: Int) -> String { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.minimumFractionDigits = decimals + formatter.maximumFractionDigits = decimals + formatter.positivePrefix = formatter.plusSign + return formatter.string(from: NSNumber(value: value)) ?? "" + } +} + +/// The status dot with words, as on the Now screen's first pill. +struct WidgetStatusLine: View { + let status: WidgetDesign.LoopStatus + var font: Font = LoopDesign.Typeface.footnote.weight(.medium) + + var body: some View { + HStack(spacing: LoopDesign.Space.s1) { + Circle().fill(status.color).frame(width: 7, height: 7) + Text(status.text) + .lineLimit(1) + .minimumScaleFactor(0.75) + } + .font(font) + .foregroundStyle(LoopDesign.Palette.ink) + } +} + +/// The glucose number with its trend arrow, in the Now hero's type. +struct WidgetGlucoseValue: View { + let value: String + let trend: GlucoseTrend? + var size: CGFloat + + var body: some View { + HStack(alignment: .center, spacing: size * 0.12) { + Text(value) + .font(.system(size: size, weight: .bold, design: .rounded).monospacedDigit()) + .foregroundStyle(LoopDesign.Palette.ink) + .lineLimit(1) + .minimumScaleFactor(0.6) + .widgetAccentable() + if let trend { + Image(systemName: WidgetDesign.trendSymbol(trend)) + .font(.system(size: size * 0.45, weight: .bold)) + .foregroundStyle(LoopDesign.Palette.glucose) + .accessibilityLabel(trend.localizedDescription) + } + } + } +} + +/// A sunken tile with a label over a value, the widget-sized `ValueTile`. +struct WidgetTile: View { + @Environment(\.widgetRenderingMode) private var renderingMode + let label: String + /// Label and value on one line, where height is short (the Live Activity has 160 points). + var inline = false + @ViewBuilder var value: Value + + var body: some View { + let layout = inline + ? AnyLayout(HStackLayout(alignment: .firstTextBaseline, spacing: LoopDesign.Space.s1)) + : AnyLayout(VStackLayout(alignment: .leading, spacing: 1)) + layout { + Text(label) + .font(.caption2) + .foregroundStyle(LoopDesign.Palette.inkMuted) + .lineLimit(1) + .minimumScaleFactor(0.7) + value + .font(.system(.subheadline, design: .rounded).weight(.semibold).monospacedDigit()) + .lineLimit(1) + .minimumScaleFactor(0.6) + } + .padding(.horizontal, LoopDesign.Space.s2) + .padding(.vertical, inline ? 5 : 6) + .frame(maxWidth: .infinity, alignment: .leading) + .background( + renderingMode == .accented ? AnyShapeStyle(.white.opacity(0.12)) : AnyShapeStyle(WidgetDesign.sunken), + in: RoundedRectangle(cornerRadius: LoopDesign.Radius.md, style: .continuous) + ) + .accessibilityElement(children: .combine) + } +} + +/// A device problem said in words, as in the Now screen's notices. +struct WidgetNotice: View { + let message: String + let symbol: String + let state: DeviceStatusHighlightState + + /// Critical first, then warnings, then information such as a sensor warming up. + static func mostSerious(_ highlights: [DeviceStatusHighlightContext?]) -> WidgetNotice? { + let rank: (DeviceStatusHighlightState) -> Int = { $0 == .critical ? 0 : $0 == .warning ? 1 : 2 } + guard let highlight = highlights.compactMap({ $0 }).min(by: { rank($0.state) < rank($1.state) }) else { return nil } + return WidgetNotice(message: highlight.localizedMessage, symbol: highlight.imageName, state: highlight.state) + } + + private var tint: Color { + switch state { + case .critical: return LoopDesign.Palette.statusCritical + case .warning: return LoopDesign.Palette.statusWarning + default: return LoopDesign.Palette.glucose + } + } + + var body: some View { + HStack(alignment: .top, spacing: 6) { + Image(systemName: symbol) + .font(.caption.weight(.bold)) + .foregroundStyle(tint) + Text(message.replacingOccurrences(of: "\n", with: " ")) + .font(.caption.weight(.semibold)) + .foregroundStyle(LoopDesign.Palette.ink) + .lineLimit(2) + .minimumScaleFactor(0.8) + } + .padding(.horizontal, LoopDesign.Space.s2) + .padding(.vertical, 6) + .frame(maxWidth: .infinity, alignment: .leading) + .background( + tint.opacity(0.18), + in: RoundedRectangle(cornerRadius: LoopDesign.Radius.md, style: .continuous) + ) + .accessibilityElement(children: .combine) + } +} + +extension View { + /// The widget's container background, in the colour of a Now screen card. + @ViewBuilder + func redesignWidgetBackground(_ color: Color) -> some View { + if #available(iOSApplicationExtension 17.0, *) { + containerBackground(for: .widget) { color } + } else { + background { color } + } + } +} diff --git a/Loop Widget Extension/Timeline/StatusWidgetTimelimeEntry.swift b/Loop Widget Extension/Timeline/StatusWidgetTimelimeEntry.swift index 4fe09ba12f..43c064a0fe 100644 --- a/Loop Widget Extension/Timeline/StatusWidgetTimelimeEntry.swift +++ b/Loop Widget Extension/Timeline/StatusWidgetTimelimeEntry.swift @@ -29,7 +29,9 @@ struct StatusWidgetTimelimeEntry: TimelineEntry { let sensor: GlucoseDisplayableContext? let pumpHighlight: DeviceStatusHighlightContext? + var cgmHighlight: DeviceStatusHighlightContext? = nil let netBasal: NetBasalContext? + var carbsOnBoard: Double? = nil let eventualGlucose: GlucoseContext? diff --git a/Loop Widget Extension/Timeline/StatusWidgetTimelineProvider.swift b/Loop Widget Extension/Timeline/StatusWidgetTimelineProvider.swift index bfc46aeaa0..0d37f6efed 100644 --- a/Loop Widget Extension/Timeline/StatusWidgetTimelineProvider.swift +++ b/Loop Widget Extension/Timeline/StatusWidgetTimelineProvider.swift @@ -174,7 +174,9 @@ class StatusWidgetTimelineProvider: TimelineProvider { unit: unit, sensor: context.glucoseDisplay, pumpHighlight: context.pumpStatusHighlightContext, + cgmHighlight: context.cgmStatusHighlightContext, netBasal: netBasal, + carbsOnBoard: context.carbsOnBoard, eventualGlucose: eventualGlucose, preMealPresetAllowed: preMealPresetAllowed, preMealPresetActive: preMealPresetActive, diff --git a/Loop Widget Extension/Widgets/SystemStatusWidget.swift b/Loop Widget Extension/Widgets/SystemStatusWidget.swift index fbe95f5384..4d8b6a6959 100644 --- a/Loop Widget Extension/Widgets/SystemStatusWidget.swift +++ b/Loop Widget Extension/Widgets/SystemStatusWidget.swift @@ -93,7 +93,11 @@ struct SystemStatusWidget: Widget { var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: StatusWidgetTimelineProvider()) { entry in - SystemStatusWidgetEntryView(entry: entry) + if WidgetDesign.useRedesign { + RedesignStatusWidgetView(entry: entry) + } else { + SystemStatusWidgetEntryView(entry: entry) + } } .configurationDisplayName("Loop Status Widget") .description("See your current blood glucose and insulin delivery.") diff --git a/Loop.xcodeproj/project.pbxproj b/Loop.xcodeproj/project.pbxproj index 03ce9afa1d..cb2a303351 100644 --- a/Loop.xcodeproj/project.pbxproj +++ b/Loop.xcodeproj/project.pbxproj @@ -50,6 +50,11 @@ 82F11F858069EDA2DF65D909 /* Loop/Resources/Sounds/voice_lgs_bryce.caf in Resources */ = {isa = PBXBuildFile; fileRef = FB860882201269230F24C96C /* Loop/Resources/Sounds/voice_lgs_bryce.caf */; }; 0996021E82CDE7DA7A3DD544 /* Loop/Resources/Sounds/voice_ulg_amy.caf in Resources */ = {isa = PBXBuildFile; fileRef = B08A706BF6BC6555453D3E56 /* Loop/Resources/Sounds/voice_ulg_amy.caf */; }; 8BAF071E821EAC3FB1B183B3 /* Loop/Resources/Sounds/voice_ulg_bryce.caf in Resources */ = {isa = PBXBuildFile; fileRef = 1F9BFD4BD97793AAE2407DCB /* Loop/Resources/Sounds/voice_ulg_bryce.caf */; }; + E6E73709263FB037F274B2A0 /* WidgetDesign.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDE6FCD6C3CA3B693C8A349B /* WidgetDesign.swift */; }; + 8602ACA648AEEBBD4793ED49 /* RedesignStatusWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E169C989E88148A68A4FEFB6 /* RedesignStatusWidgetView.swift */; }; + FE8902221761558AAEDFFE02 /* RedesignLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9792C496505ED5C2F302AB /* RedesignLiveActivity.swift */; }; + 4CC1A96D0600081991783423 /* LoopDesign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BD3DDF41B598A8C4B5CEB92 /* LoopDesign.swift */; }; + 1419606428D9550400BA86E0 /* LoopKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 437AFEE6203688CF008C4892 /* LoopKitUI.framework */; }; 1419606928D9554E00BA86E0 /* LoopKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 437AFEE6203688CF008C4892 /* LoopKitUI.framework */; }; 1419606A28D955BC00BA86E0 /* MockKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C101947127DD473C004E7EB8 /* MockKitUI.framework */; }; 142CB7592A60BF2E0075748A /* EditMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142CB7582A60BF2E0075748A /* EditMode.swift */; }; @@ -717,6 +722,20 @@ FEEDB0000000000000000004 /* Statistics/TimeInRangeBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEEDF0000000000000000004 /* Statistics/TimeInRangeBar.swift */; }; 30E4A68B8C914C5E4B245555 /* InsulinDeliveryHistoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F69CE2EE3714858772FE7A26 /* InsulinDeliveryHistoryTests.swift */; }; FEEDB0000000000000000005 /* GlucoseStatisticsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEEDF0000000000000000005 /* GlucoseStatisticsTests.swift */; }; + 89C0C34F420190E8CC7D03B1 /* DayCharts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F40DE2F3FC02CBA3BE7AF2F /* DayCharts.swift */; }; + 332CC9FC011E78CE5BEA583C /* LoopDesign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BD3DDF41B598A8C4B5CEB92 /* LoopDesign.swift */; }; + 0C70F4D862F6D3FDB3D91D87 /* LoopHistoryMath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21622B2355AED8F6A12FE17C /* LoopHistoryMath.swift */; }; + 2ADBB92A8ABB74360D18EEFA /* LoopHistoryModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 471FFD525A4EB897745608BE /* LoopHistoryModels.swift */; }; + A743DC26D066EE5AC88C2F45 /* LoopHistoryProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09448CF97996C40BEDDE6588 /* LoopHistoryProvider.swift */; }; + A1B2C3D4E5F6A7B8C9D0E1F2 /* AppearanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2E1D0C9B8A7F6E5D4C3B2A1 /* AppearanceSettings.swift */; }; + 6A6C1E1C7A26EC88AFB4FAB1 /* DayDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3A83D311A9ECAE563F74A51 /* DayDetailView.swift */; }; + 23B98F0A53A093412229364D /* LogbookScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AEDC42672A7A8C57546EA0C /* LogbookScreen.swift */; }; + C4B5E0A1D2F3A4B5C6D7E8F9 /* CarbEntryScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B5E0A1D2F3A4B5C6D7E8FA /* CarbEntryScreen.swift */; }; + 3ED693ACBF8F9E416055BD56 /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 844BECBB6357021979B9443F /* MainTabBarController.swift */; }; + 7705483CFFCF0B89F8F1A08E /* NowScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0874B7B679DB9CE661CCE152 /* NowScreen.swift */; }; + 591F13AF435B37B4818E2F2B /* TrendsComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BFDE56977CC73CBDA1170C5 /* TrendsComponents.swift */; }; + 5CD0888FF33D6F844A81E638 /* TrendsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF0FD64B2B3E9C9AA8764684 /* TrendsScreen.swift */; }; + 97CF13197936D2794766C84A /* LoopHistoryMathTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42B08644C3031D9E815F9892 /* LoopHistoryMathTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -856,6 +875,9 @@ /* Begin PBXFileReference section */ 0FC34B523FE5A50C920506D5 /* Loop/Resources/Sounds/alarm.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Loop/Resources/Sounds/alarm.caf; sourceTree = SOURCE_ROOT; }; + FDE6FCD6C3CA3B693C8A349B /* WidgetDesign.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetDesign.swift; sourceTree = ""; }; + E169C989E88148A68A4FEFB6 /* RedesignStatusWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedesignStatusWidgetView.swift; sourceTree = ""; }; + DB9792C496505ED5C2F302AB /* RedesignLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedesignLiveActivity.swift; sourceTree = ""; }; 142CB7582A60BF2E0075748A /* EditMode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditMode.swift; sourceTree = ""; }; 142CB75A2A60BFC30075748A /* FavoriteFoodsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FavoriteFoodsView.swift; sourceTree = ""; }; 1452F4A82A851C9400F8B9E4 /* FavoriteFoodAddEditViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteFoodAddEditViewModel.swift; sourceTree = ""; }; @@ -1584,6 +1606,20 @@ FEEDF0000000000000000004 /* Statistics/TimeInRangeBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Statistics/TimeInRangeBar.swift; sourceTree = ""; }; F69CE2EE3714858772FE7A26 /* InsulinDeliveryHistoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsulinDeliveryHistoryTests.swift; sourceTree = ""; }; FEEDF0000000000000000005 /* GlucoseStatisticsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlucoseStatisticsTests.swift; sourceTree = ""; }; + 6F40DE2F3FC02CBA3BE7AF2F /* DayCharts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayCharts.swift; sourceTree = ""; }; + 0BD3DDF41B598A8C4B5CEB92 /* LoopDesign.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopDesign.swift; sourceTree = ""; }; + 21622B2355AED8F6A12FE17C /* LoopHistoryMath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopHistoryMath.swift; sourceTree = ""; }; + 471FFD525A4EB897745608BE /* LoopHistoryModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopHistoryModels.swift; sourceTree = ""; }; + 09448CF97996C40BEDDE6588 /* LoopHistoryProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopHistoryProvider.swift; sourceTree = ""; }; + F2E1D0C9B8A7F6E5D4C3B2A1 /* AppearanceSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppearanceSettings.swift; sourceTree = ""; }; + E3A83D311A9ECAE563F74A51 /* DayDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayDetailView.swift; sourceTree = ""; }; + 7AEDC42672A7A8C57546EA0C /* LogbookScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogbookScreen.swift; sourceTree = ""; }; + C4B5E0A1D2F3A4B5C6D7E8FA /* CarbEntryScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarbEntryScreen.swift; sourceTree = ""; }; + 844BECBB6357021979B9443F /* MainTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = ""; }; + 0874B7B679DB9CE661CCE152 /* NowScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NowScreen.swift; sourceTree = ""; }; + 4BFDE56977CC73CBDA1170C5 /* TrendsComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendsComponents.swift; sourceTree = ""; }; + AF0FD64B2B3E9C9AA8764684 /* TrendsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendsScreen.swift; sourceTree = ""; }; + 42B08644C3031D9E815F9892 /* LoopHistoryMathTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopHistoryMathTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1676,9 +1712,20 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 17D23E8E964F381FCC67C938 /* Redesign */ = { + isa = PBXGroup; + children = ( + FDE6FCD6C3CA3B693C8A349B /* WidgetDesign.swift */, + E169C989E88148A68A4FEFB6 /* RedesignStatusWidgetView.swift */, + DB9792C496505ED5C2F302AB /* RedesignLiveActivity.swift */, + ); + path = Redesign; + sourceTree = ""; + }; 14B1736128AED9EC006CCD7C /* Loop Widget Extension */ = { isa = PBXGroup; children = ( + 17D23E8E964F381FCC67C938 /* Redesign */, 147EFE8D2A8BCC5500272438 /* DefaultAssets.xcassets */, 147EFE8F2A8BCD8000272438 /* DerivedAssets.xcassets */, 147EFE912A8BCD8A00272438 /* DerivedAssetsBase.xcassets */, @@ -1903,6 +1950,7 @@ 43776F8E1B8022E90074EA36 /* Loop */ = { isa = PBXGroup; children = ( + 8574687EF267DC59043C0242 /* Redesign */, C16DA84022E8E104008624C2 /* Plugins */, B66D1F322E6A5D6600471149 /* Localizable.xcstrings */, B66D1F382E6A5D6600471149 /* InfoPlist.xcstrings */, @@ -2800,6 +2848,7 @@ 6C1F8E3BA2D45079B3E2F512 /* OutcomesPackageTests.swift */, BE36167100E59D7413C50F63 /* SetupComparisonTests.swift */, FEEDF0000000000000000005 /* GlucoseStatisticsTests.swift */, + 42B08644C3031D9E815F9892 /* LoopHistoryMathTests.swift */, A9DFAFB224F0415E00950D1E /* CarbBackfillRequestUserInfoTests.swift */, A963B279252CEBAE0062AA12 /* SetBolusUserInfoTests.swift */, C19008FF252271BB00721625 /* SimpleBolusCalculatorTests.swift */, @@ -2975,6 +3024,26 @@ path = Fixtures; sourceTree = ""; }; + 8574687EF267DC59043C0242 /* Redesign */ = { + isa = PBXGroup; + children = ( + AF0FD64B2B3E9C9AA8764684 /* TrendsScreen.swift */, + 4BFDE56977CC73CBDA1170C5 /* TrendsComponents.swift */, + 0874B7B679DB9CE661CCE152 /* NowScreen.swift */, + 844BECBB6357021979B9443F /* MainTabBarController.swift */, + C4B5E0A1D2F3A4B5C6D7E8FA /* CarbEntryScreen.swift */, + 7AEDC42672A7A8C57546EA0C /* LogbookScreen.swift */, + F2E1D0C9B8A7F6E5D4C3B2A1 /* AppearanceSettings.swift */, + E3A83D311A9ECAE563F74A51 /* DayDetailView.swift */, + 09448CF97996C40BEDDE6588 /* LoopHistoryProvider.swift */, + 471FFD525A4EB897745608BE /* LoopHistoryModels.swift */, + 21622B2355AED8F6A12FE17C /* LoopHistoryMath.swift */, + 0BD3DDF41B598A8C4B5CEB92 /* LoopDesign.swift */, + 6F40DE2F3FC02CBA3BE7AF2F /* DayCharts.swift */, + ); + path = Redesign; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -3585,6 +3654,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + E6E73709263FB037F274B2A0 /* WidgetDesign.swift in Sources */, + 8602ACA648AEEBBD4793ED49 /* RedesignStatusWidgetView.swift in Sources */, + FE8902221761558AAEDFFE02 /* RedesignLiveActivity.swift in Sources */, + 4CC1A96D0600081991783423 /* LoopDesign.swift in Sources */, 14B1738128AEDC70006CCD7C /* StatusExtensionContext.swift in Sources */, 1455ACA92C66665D004F44F2 /* StateColorPalette.swift in Sources */, 14B1737628AEDC6C006CCD7C /* HKUnit.swift in Sources */, @@ -3626,6 +3699,19 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5CD0888FF33D6F844A81E638 /* TrendsScreen.swift in Sources */, + 591F13AF435B37B4818E2F2B /* TrendsComponents.swift in Sources */, + 7705483CFFCF0B89F8F1A08E /* NowScreen.swift in Sources */, + 3ED693ACBF8F9E416055BD56 /* MainTabBarController.swift in Sources */, + 23B98F0A53A093412229364D /* LogbookScreen.swift in Sources */, + C4B5E0A1D2F3A4B5C6D7E8F9 /* CarbEntryScreen.swift in Sources */, + A1B2C3D4E5F6A7B8C9D0E1F2 /* AppearanceSettings.swift in Sources */, + 6A6C1E1C7A26EC88AFB4FAB1 /* DayDetailView.swift in Sources */, + A743DC26D066EE5AC88C2F45 /* LoopHistoryProvider.swift in Sources */, + 2ADBB92A8ABB74360D18EEFA /* LoopHistoryModels.swift in Sources */, + 0C70F4D862F6D3FDB3D91D87 /* LoopHistoryMath.swift in Sources */, + 332CC9FC011E78CE5BEA583C /* LoopDesign.swift in Sources */, + 89C0C34F420190E8CC7D03B1 /* DayCharts.swift in Sources */, C17824A51E1AD4D100D9D25C /* ManualBolusRecommendation.swift in Sources */, 897A5A9624C2175B00C4E71D /* BolusEntryView.swift in Sources */, 4F70C2131DE90339006380B7 /* StatusExtensionContext.swift in Sources */, @@ -4074,6 +4160,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 97CF13197936D2794766C84A /* LoopHistoryMathTests.swift in Sources */, A9DF02CB24F72B9E00B7C988 /* CriticalEventLogTests.swift in Sources */, 1D80313D24746274002810DF /* AlertStoreTests.swift in Sources */, C1777A6625A125F100595963 /* ManualEntryDoseViewModelTests.swift in Sources */, @@ -4664,6 +4751,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "$(APPICON_NAME)"; + ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIconDayNight AppIconDay AppIconNight"; CODE_SIGN_ENTITLEMENTS = "$(LOOP_ENTITLEMENTS)"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -4693,6 +4781,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "$(APPICON_NAME)"; + ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIconDayNight AppIconDay AppIconNight"; CODE_SIGN_ENTITLEMENTS = "$(LOOP_ENTITLEMENTS)"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; diff --git a/Loop/DefaultAssets.xcassets/AppIconPreviewDay.imageset/AppIconPreviewDay.png b/Loop/DefaultAssets.xcassets/AppIconPreviewDay.imageset/AppIconPreviewDay.png new file mode 100644 index 0000000000..e47fb9b46f Binary files /dev/null and b/Loop/DefaultAssets.xcassets/AppIconPreviewDay.imageset/AppIconPreviewDay.png differ diff --git a/Loop/DefaultAssets.xcassets/AppIconPreviewDay.imageset/Contents.json b/Loop/DefaultAssets.xcassets/AppIconPreviewDay.imageset/Contents.json new file mode 100644 index 0000000000..689ca3fe4d --- /dev/null +++ b/Loop/DefaultAssets.xcassets/AppIconPreviewDay.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images": [ + { + "filename": "AppIconPreviewDay.png", + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DefaultAssets.xcassets/AppIconPreviewDayNight.imageset/AppIconPreviewDayNight.png b/Loop/DefaultAssets.xcassets/AppIconPreviewDayNight.imageset/AppIconPreviewDayNight.png new file mode 100644 index 0000000000..5d9ed19352 Binary files /dev/null and b/Loop/DefaultAssets.xcassets/AppIconPreviewDayNight.imageset/AppIconPreviewDayNight.png differ diff --git a/Loop/DefaultAssets.xcassets/AppIconPreviewDayNight.imageset/Contents.json b/Loop/DefaultAssets.xcassets/AppIconPreviewDayNight.imageset/Contents.json new file mode 100644 index 0000000000..b35f62954c --- /dev/null +++ b/Loop/DefaultAssets.xcassets/AppIconPreviewDayNight.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images": [ + { + "filename": "AppIconPreviewDayNight.png", + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DefaultAssets.xcassets/AppIconPreviewNight.imageset/AppIconPreviewNight.png b/Loop/DefaultAssets.xcassets/AppIconPreviewNight.imageset/AppIconPreviewNight.png new file mode 100644 index 0000000000..019c6d968c Binary files /dev/null and b/Loop/DefaultAssets.xcassets/AppIconPreviewNight.imageset/AppIconPreviewNight.png differ diff --git a/Loop/DefaultAssets.xcassets/AppIconPreviewNight.imageset/Contents.json b/Loop/DefaultAssets.xcassets/AppIconPreviewNight.imageset/Contents.json new file mode 100644 index 0000000000..01fec4c507 --- /dev/null +++ b/Loop/DefaultAssets.xcassets/AppIconPreviewNight.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images": [ + { + "filename": "AppIconPreviewNight.png", + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/AppIconDay.appiconset/AppIconDay.png b/Loop/DerivedAssetsBase.xcassets/AppIconDay.appiconset/AppIconDay.png new file mode 100644 index 0000000000..767082980e Binary files /dev/null and b/Loop/DerivedAssetsBase.xcassets/AppIconDay.appiconset/AppIconDay.png differ diff --git a/Loop/DerivedAssetsBase.xcassets/AppIconDay.appiconset/Contents.json b/Loop/DerivedAssetsBase.xcassets/AppIconDay.appiconset/Contents.json new file mode 100644 index 0000000000..5e9df36117 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/AppIconDay.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images": [ + { + "filename": "AppIconDay.png", + "idiom": "universal", + "platform": "ios", + "size": "1024x1024" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/AppIconDayNight.appiconset/AppIconDayNight-Dark.png b/Loop/DerivedAssetsBase.xcassets/AppIconDayNight.appiconset/AppIconDayNight-Dark.png new file mode 100644 index 0000000000..47a5dad744 Binary files /dev/null and b/Loop/DerivedAssetsBase.xcassets/AppIconDayNight.appiconset/AppIconDayNight-Dark.png differ diff --git a/Loop/DerivedAssetsBase.xcassets/AppIconDayNight.appiconset/AppIconDayNight.png b/Loop/DerivedAssetsBase.xcassets/AppIconDayNight.appiconset/AppIconDayNight.png new file mode 100644 index 0000000000..767082980e Binary files /dev/null and b/Loop/DerivedAssetsBase.xcassets/AppIconDayNight.appiconset/AppIconDayNight.png differ diff --git a/Loop/DerivedAssetsBase.xcassets/AppIconDayNight.appiconset/Contents.json b/Loop/DerivedAssetsBase.xcassets/AppIconDayNight.appiconset/Contents.json new file mode 100644 index 0000000000..c34d1b8588 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/AppIconDayNight.appiconset/Contents.json @@ -0,0 +1,26 @@ +{ + "images": [ + { + "filename": "AppIconDayNight.png", + "idiom": "universal", + "platform": "ios", + "size": "1024x1024" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "filename": "AppIconDayNight-Dark.png", + "idiom": "universal", + "platform": "ios", + "size": "1024x1024" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/AppIconNight.appiconset/AppIconNight.png b/Loop/DerivedAssetsBase.xcassets/AppIconNight.appiconset/AppIconNight.png new file mode 100644 index 0000000000..47a5dad744 Binary files /dev/null and b/Loop/DerivedAssetsBase.xcassets/AppIconNight.appiconset/AppIconNight.png differ diff --git a/Loop/DerivedAssetsBase.xcassets/AppIconNight.appiconset/Contents.json b/Loop/DerivedAssetsBase.xcassets/AppIconNight.appiconset/Contents.json new file mode 100644 index 0000000000..a9f66f6697 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/AppIconNight.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images": [ + { + "filename": "AppIconNight.png", + "idiom": "universal", + "platform": "ios", + "size": "1024x1024" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/accent-ink.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/accent-ink.colorset/Contents.json new file mode 100644 index 0000000000..af109ce19a --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/accent-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.384", + "blue": "0.800", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.039", + "green": "0.518", + "blue": "1.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/agp-inner.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/agp-inner.colorset/Contents.json new file mode 100644 index 0000000000..2ddc0f5f90 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/agp-inner.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.690", + "blue": "1.000", + "alpha": "0.340" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.729", + "blue": "1.000", + "alpha": "0.380" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/agp-outer.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/agp-outer.colorset/Contents.json new file mode 100644 index 0000000000..270771d475 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/agp-outer.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.690", + "blue": "1.000", + "alpha": "0.160" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.729", + "blue": "1.000", + "alpha": "0.180" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/basal-edge.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/basal-edge.colorset/Contents.json new file mode 100644 index 0000000000..fa72f9b84c --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/basal-edge.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.890", + "green": "0.725", + "blue": "0.514", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.431", + "green": "0.322", + "blue": "0.196", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/basal.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/basal.colorset/Contents.json new file mode 100644 index 0000000000..76f27a3287 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/basal.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.988", + "green": "0.890", + "blue": "0.761", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.263", + "green": "0.188", + "blue": "0.106", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/bolus.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/bolus.colorset/Contents.json new file mode 100644 index 0000000000..30b11e52a8 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/bolus.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.663", + "green": "0.282", + "blue": "0.039", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.639", + "blue": "0.278", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/carbs-ink.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/carbs-ink.colorset/Contents.json new file mode 100644 index 0000000000..df21da3860 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/carbs-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.184", + "green": "0.490", + "blue": "0.086", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.349", + "green": "0.894", + "blue": "0.200", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/control-thumb.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/control-thumb.colorset/Contents.json new file mode 100644 index 0000000000..34b15edebe --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/control-thumb.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "1.000", + "blue": "1.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.388", + "blue": "0.400", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/critical-ink.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/critical-ink.colorset/Contents.json new file mode 100644 index 0000000000..2f18c32cc1 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/critical-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.769", + "green": "0.188", + "blue": "0.169", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.412", + "blue": "0.380", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/glucose-ink.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/glucose-ink.colorset/Contents.json new file mode 100644 index 0000000000..b704d8af81 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/glucose-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.439", + "blue": "0.722", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.729", + "blue": "1.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/ink-muted.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/ink-muted.colorset/Contents.json new file mode 100644 index 0000000000..6eda3190f3 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/ink-muted.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.424", + "green": "0.424", + "blue": "0.439", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.682", + "green": "0.682", + "blue": "0.698", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/insulin-ink.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/insulin-ink.colorset/Contents.json new file mode 100644 index 0000000000..1acea580ea --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/insulin-ink.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.541", + "green": "0.227", + "blue": "0.024", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.639", + "blue": "0.278", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/range-high.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/range-high.colorset/Contents.json new file mode 100644 index 0000000000..28f578bf71 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/range-high.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.949", + "green": "0.718", + "blue": "0.020", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.839", + "blue": "0.039", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/range-in.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/range-in.colorset/Contents.json new file mode 100644 index 0000000000..3d0f452a75 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/range-in.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.184", + "green": "0.659", + "blue": "0.310", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.196", + "green": "0.843", + "blue": "0.294", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/range-low.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/range-low.colorset/Contents.json new file mode 100644 index 0000000000..1349d6a59e --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/range-low.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.898", + "green": "0.282", + "blue": "0.302", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.624", + "blue": "0.604", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/range-very-high.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/range-very-high.colorset/Contents.json new file mode 100644 index 0000000000..b2851438d1 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/range-very-high.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.541", + "green": "0.380", + "blue": "0.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.788", + "green": "0.541", + "blue": "0.000", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/range-very-low.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/range-very-low.colorset/Contents.json new file mode 100644 index 0000000000..46e9e70555 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/range-very-low.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.608", + "green": "0.110", + "blue": "0.122", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.271", + "blue": "0.227", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/status-critical.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/status-critical.colorset/Contents.json new file mode 100644 index 0000000000..9c67fd2db6 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/status-critical.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.231", + "blue": "0.188", + "alpha": "1.000" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "1.000", + "green": "0.271", + "blue": "0.227", + "alpha": "1.000" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/DerivedAssetsBase.xcassets/target-band.colorset/Contents.json b/Loop/DerivedAssetsBase.xcassets/target-band.colorset/Contents.json new file mode 100644 index 0000000000..6ff45863c5 --- /dev/null +++ b/Loop/DerivedAssetsBase.xcassets/target-band.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors": [ + { + "color": { + "color-space": "srgb", + "components": { + "red": "0.000", + "green": "0.690", + "blue": "1.000", + "alpha": "0.140" + } + }, + "idiom": "universal" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "color": { + "color-space": "srgb", + "components": { + "red": "0.388", + "green": "0.729", + "blue": "1.000", + "alpha": "0.180" + } + }, + "idiom": "universal" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Loop/Localizable.xcstrings b/Loop/Localizable.xcstrings index e8be2e8501..078fe8265a 100644 --- a/Loop/Localizable.xcstrings +++ b/Loop/Localizable.xcstrings @@ -13,32441 +13,68393 @@ " -" : { }, - " - " : { - - }, - " (pending: %@)" : { - "comment" : "The string format appended to active insulin that describes pending insulin. (1: pending insulin)", - "extractionState" : "manual", + "%1$@ ago" : { + "comment" : "Carb entry time choice: eaten this long before now. (1: duration, e.g. 15m or 1h)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : " (قيد الانتظار: %@)" + "value" : "قبل %1$@" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : " (afventer: %@)" + "value" : "před %1$@" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : " (stehen aus: %@)" + "value" : "%1$@ siden" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : " (pending: %@)" + "value" : "vor %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : " (pendiente: %@)" + "value" : "hace %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "(odot.: %@)" + "value" : "%1$@ sitten" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : " (en attente : %@)" + "value" : "il y a %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : " (pending: %@)" + "value" : "לפני %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ezelőtt" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : " (in attesa: %@)" + "value" : "%1$@ fa" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : " (保留中: %@)" + "value" : "%1$@前" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "(venter: %@ )" + "value" : "%1$@ siden" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : " (Wachten: %@)" + "value" : "%1$@ geleden" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : " (oczekujące: %@)" + "value" : "%1$@ temu" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : " (pendente: %@)" + "value" : "há %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : " (în așteptare: %@)" + "value" : "acum %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : " (В ожидании: %@)" + "value" : "%1$@ назад" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "pred %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : " (återstår: %@)" + "value" : "för %1$@ sedan" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : " (bekliyor: %@)" + "value" : "%1$@ önce" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ тому" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : " (đang chờ xử lý: %@)" + "value" : "%1$@ trước" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : " (待执行: %@)" + "value" : "%1$@前" } } } }, - " **Tip** Use your %@ **Jogging** preset" : { - - }, - " **Tip** Use your %@ **Walking** preset" : { - - }, - " %" : { - - }, - " %@" : { - - }, - " %@" : { - - }, - " %@ · " : { - - }, - " %@ read" : { - - }, - " %lld hours ago" : { - - }, - " grams" : { - - }, - " of " : { - - }, - " Pre-meal Preset" : { - "comment" : "Status row title for premeal override enabled (leading space is to separate from symbol)", - "extractionState" : "stale", + "%1$@ manual, %2$@ automatic" : { + "comment" : "VoiceOver: how the bolus divides. (1: manual units, 2: automatic units)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ يدوي، %2$@ تلقائي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ručně, %2$@ automaticky" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Før-måltid forudindstillinger" + "value" : "%1$@ manuel, %2$@ automatisk" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : " Voreinstellung zum Essen" + "value" : "%1$@ manuell, %2$@ automatisch" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : " Pre-Comida Preestablecida" + "value" : "%1$@ manual, %2$@ automático" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : " Ennen ateriaa -esiasetus" + "value" : "%1$@ manuaalinen, %2$@ automaattinen" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : " Préréglage Pré-repas" + "value" : "%1$@ manuel, %2$@ automatique" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "קדם-ארוחה" + "value" : "%1$@ ידני, %2$@ אוטומטי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kézi, %2$@ automatikus" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : " Preset pre-pasto" + "value" : "%1$@ manuale, %2$@ automatico" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "手動 %1$@、自動 %2$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Forhåndsinnstilling før måltid" + "value" : "%1$@ manuell, %2$@ automatisk" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : " Pre-Meal programma" + "value" : "%1$@ handmatig, %2$@ automatisch" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : " Przed Posiłkiem" + "value" : "%1$@ ręcznie, %2$@ automatycznie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ manual, %2$@ automático" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : " Presetare înainte de masă" + "value" : "%1$@ manual, %2$@ automat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Режим до еды" + "value" : "%1$@ вручную, %2$@ автоматически" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ručne, %2$@ automaticky" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : " Preprandiellt förval" + "value" : "%1$@ manuell, %2$@ automatisk" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Yemek-Öncesi Ön Ayarı" + "value" : "%1$@ manuel, %2$@ otomatik" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ вручну, %2$@ автоматично" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ thủ công, %2$@ tự động" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : " 餐前预设" + "value" : "手动 %1$@,自动 %2$@" } } } }, - " remaining" : { - "comment" : "remaining time in setting's profile expiration section", + "%lld doses" : { + "comment" : "Logbook folded automatic boluses row: how many automatic boluses it holds. (1: number)", "localizations" : { + "ar" : { + "variations" : { + "plural" : { + "zero" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld جرعة" + } + }, + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "جرعة واحدة" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "جرعتان" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld جرعات" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld جرعة" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld جرعة" + } + } + } + } + }, "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "zbývající" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dávka" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dávky" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dávky" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dávek" + } + } + } } }, "da" : { - "stringUnit" : { - "state" : "translated", - "value" : " tilbage" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dosis" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doser" + } + } + } } }, "de" : { - "stringUnit" : { - "state" : "translated", - "value" : " verbleiben" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Dosis" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Dosen" + } + } + } + } + }, + "en" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dose" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doses" + } + } + } } }, "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "restantes" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dosis" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dosis" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dosis" + } + } + } + } + }, + "fi" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld annos" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld annosta" + } + } + } } }, "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : " restant(s)" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dose" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doses" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doses" + } + } + } } }, "he" : { - "stringUnit" : { - "state" : "translated", - "value" : " נותר" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "מנה %lld" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld מנות" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld מנות" + } + } + } } }, "hu" : { - "stringUnit" : { - "state" : "translated", - "value" : "remaining" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld adag" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld adag" + } + } + } } }, "it" : { - "stringUnit" : { - "state" : "translated", - "value" : " rimanenti" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dose" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dosi" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dosi" + } + } + } + } + }, + "ja" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld回" + } + } + } } }, "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "gjenstående" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dose" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doser" + } + } + } } }, "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : " resterend" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dosis" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doses" + } + } + } } }, "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : " pozostały" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dawka" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dawki" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dawek" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dawki" + } + } + } + } + }, + "pt-BR" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dose" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doses" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doses" + } + } + } } }, "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : " rămas" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doză" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doze" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld de doze" + } + } + } } }, "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : " осталось" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld доза" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld дозы" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld доз" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld дозы" + } + } + } + } + }, + "sk" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dávka" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dávky" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dávky" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dávok" + } + } + } + } + }, + "sv" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dos" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doser" + } + } + } } }, "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "kalan" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doz" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld doz" + } + } + } } }, "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "remaining" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld доза" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld дози" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld доз" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld дози" + } + } + } + } + }, + "vi" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld liều" + } + } + } } }, "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : " 剩余" + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld 次" + } + } + } } } } }, - " Safety Notifications are OFF" : { - "comment" : "Warning text for when Notifications or Critical Alerts Permissions is disabled", - "extractionState" : "stale", + "%lld entries" : { + "comment" : "Trends Carbs tile detail for a one-day period: how many carb entries were made that day. (1: number)", "localizations" : { + "ar" : { + "variations" : { + "plural" : { + "zero" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld إدخالات" + } + }, + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "إدخال واحد" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "إدخالان" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld إدخالات" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld إدخالًا" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld إدخال" + } + } + } + } + }, + "cs" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld záznam" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld záznamy" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld záznamu" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld záznamů" + } + } + } + } + }, "da" : { - "stringUnit" : { - "state" : "translated", - "value" : " Sikkerhedsmeddelelser er SLÅET FRA" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registrering" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registreringer" + } + } + } } }, "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sicherheitsbenachrichtigungen sind ausgeschaltet" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Eintrag" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Einträge" + } + } + } + } + }, + "en" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld entry" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld entries" + } + } + } } }, "es" : { - "stringUnit" : { - "state" : "translated", - "value" : " Notificaciones de seguridad desactivadas" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld entrada" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld entradas" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld entradas" + } + } + } + } + }, + "fi" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kirjaus" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kirjausta" + } + } + } } }, "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifications de sécurité sont DÉSACTIVÉES" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld entrée" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld entrées" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld entrées" + } + } + } } }, "he" : { - "stringUnit" : { - "state" : "translated", - "value" : " התראות בטיחות כבויות" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "רשומה אחת" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld רשומות" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld רשומות" + } + } + } + } + }, + "hu" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld bejegyzés" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld bejegyzés" + } + } + } } }, "it" : { - "stringUnit" : { - "state" : "translated", - "value" : " Le notifiche di sicurezza sono disattivate" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld inserimento" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld inserimenti" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld inserimenti" + } + } + } + } + }, + "ja" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld件" + } + } + } } }, "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sikkerhetsvarsler er AV" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registrering" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registreringer" + } + } + } } }, "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : " Veiligheids- en kritieke meldingen staan UIT" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registratie" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registraties" + } + } + } } }, "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Powiadomienia dotyczące bezpieczeństwa są WYŁĄCZONE" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld wpis" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld wpisy" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld wpisów" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld wpisu" + } + } + } + } + }, + "pt-BR" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registro" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registros" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registros" + } + } + } } }, "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : " Notificările de siguranță sunt dezactivate" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld intrare" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld intrări" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld de intrări" + } + } + } } }, "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : " Оповещения о безопасности выключены" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld запись" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld записи" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld записей" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld записи" + } + } + } + } + }, + "sk" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld záznam" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld záznamy" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld záznamu" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld záznamov" + } + } + } + } + }, + "sv" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registrering" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld registreringar" + } + } + } } }, "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Güvenlik Bildirimleri KAPALI" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld giriş" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld giriş" + } + } + } + } + }, + "uk" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld запис" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld записи" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld записів" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld запису" + } + } + } + } + }, + "vi" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld lần nhập" + } + } + } } }, "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : " 安全提醒已关闭" + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld条" + } + } + } } } } }, - " setting. Adjusting it can help reduce the risk of low glucose if you expect unusual fluctuations." : { - - }, - " Workout Preset" : { - "comment" : "Status row title for workout override enabled (leading space is to separate from symbol)", - "extractionState" : "stale", + "Aim: average under %1$@ %2$@, GMI under 7%%, CV 36%% or less." : { + "comment" : "Trends Summary footnote: the consensus targets for average glucose, GMI and glucose variability (CV). (1: glucose value, 2: glucose unit)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الهدف: متوسط أقل من %1$@ %2$@، وGMI أقل من 7%%، وCV ‏36%% أو أقل." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cíl: průměr pod %1$@ %2$@, GMI pod 7%%, CV nejvýše 36%%." + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Motion forudindstilling" + "value" : "Mål: gennemsnit under %1$@ %2$@, GMI under 7 %%, CV højst 36 %%." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : " Zielbereichsänderung" + "value" : "Ziel: Durchschnitt unter %1$@ %2$@, GMI unter 7 %%, VK höchstens 36 %%." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : " Ejercicio Preestablecido" + "value" : "Objetivo: promedio por debajo de %1$@ %2$@, GMI por debajo del 7%%, CV del 36%% o menos." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : " Liikuntatila" + "value" : "Tavoite: keskiarvo alle %1$@ %2$@, GMI alle 7 %%, CV enintään 36 %%." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : " Préréglage exercice" + "value" : "Objectif : moyenne sous %1$@ %2$@, GMI sous 7 %%, CV de 36 %% au plus." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "פעילות גופנית" + "value" : "יעד: ממוצע מתחת ל-%1$@ %2$@, GMI מתחת ל-7%%, CV ‏36%% או פחות." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cél: átlag %1$@ %2$@ alatt, GMI 7%% alatt, CV legfeljebb 36%%." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : " Preset allenamento" + "value" : "Obiettivo: media sotto %1$@ %2$@, GMI sotto il 7%%, CV al massimo 36%%." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "目標:平均%1$@ %2$@未満、GMI 7%%未満、CV 36%%以下。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Forhåndsinnstilling for trening" + "value" : "Mål: gjennomsnitt under %1$@ %2$@, GMI under 7 %%, CV høyst 36 %%." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : " Trainingsprogramma" + "value" : "Doel: gemiddelde onder %1$@ %2$@, GMI onder 7%%, CV hoogstens 36%%." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : " Wstępne ustawienia treningu" + "value" : "Cel: średnia poniżej %1$@ %2$@, GMI poniżej 7%%, CV najwyżej 36%%." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meta: média abaixo de %1$@ %2$@, GMI abaixo de 7%%, CV de no máximo 36%%." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : " Presetare antrenament" + "value" : "Țintă: medie sub %1$@ %2$@, GMI sub 7%%, CV de cel mult 36%%." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Пресет физнагрузки" + "value" : "Цель: среднее ниже %1$@ %2$@, GMI ниже 7%%, CV не более 36%%." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cieľ: priemer pod %1$@ %2$@, GMI pod 7%%, CV najviac 36%%." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : " Träningsförval" + "value" : "Mål: genomsnitt under %1$@ %2$@, GMI under 7 %%, CV högst 36 %%." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Egzersiz Ön Ayarı" + "value" : "Hedef: ortalama %1$@ %2$@ altı, GMI %%7 altı, CV en fazla %%36." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Мета: середнє нижче %1$@ %2$@, GMI нижче 7%%, CV не більше 36%%." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mục tiêu: trung bình dưới %1$@ %2$@, GMI dưới 7%%, CV từ 36%% trở xuống." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : " 运动预设" + "value" : "目标:平均值低于 %1$@ %2$@,GMI 低于 7%%,CV 不超过 36%%。" } } } }, - "-" : { - "comment" : "A hyphen.", - "isCommentAutoGenerated" : true - }, - "-.--" : { - - }, - "–" : { - "comment" : "String denoting lack of a recommended bolus amount in the simple bolus calculator" - }, - "." : { - "comment" : "Full stop character", + "Aim: over 70%% in range; under 25%% above and 4%% below; under 5%% very high and 1%% very low; CGM active over 70%%." : { + "comment" : "Trends Time in range card footnote: the consensus targets for time in range, above and below range, very high, very low and CGM wear", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الهدف: أكثر من 70%% ضمن النطاق؛ أقل من 25%% فوق و4%% تحت؛ أقل من 5%% مرتفع جدًا و1%% منخفض جدًا؛ وCGM نشط أكثر من 70%%." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cíl: přes 70%% v rozsahu; pod 25%% nad a 4%% pod; pod 5%% velmi vysoko a 1%% velmi nízko; CGM aktivní přes 70%%." + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Mål: over 70 %% i området; under 25 %% over og 4 %% under; under 5 %% meget højt og 1 %% meget lavt; CGM aktiv over 70 %%." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Ziel: über 70 %% im Zielbereich; unter 25 %% darüber und 4 %% darunter; unter 5 %% sehr hoch und 1 %% sehr niedrig; CGM über 70 %% aktiv." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Objetivo: más del 70%% en rango; menos del 25%% por encima y del 4%% por debajo; menos del 5%% muy alto y del 1%% muy bajo; CGM activo más del 70%%." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tavoite: yli 70 %% tavoitealueella; alle 25 %% yläpuolella ja 4 %% alapuolella; alle 5 %% erittäin korkealla ja 1 %% erittäin matalalla; CGM aktiivinen yli 70 %%." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "-" + "value" : "Objectif : plus de 70 %% dans la cible ; moins de 25 %% au-dessus et 4 %% en dessous ; moins de 5 %% très haut et 1 %% très bas ; CGM actif plus de 70 %%." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "יעד: מעל 70%% בטווח; מתחת ל-25%% מעל ו-4%% מתחת; מתחת ל-5%% גבוה מאוד ו-1%% נמוך מאוד; CGM פעיל מעל 70%%." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cél: több mint 70%% tartományban; kevesebb mint 25%% felette és 4%% alatta; kevesebb mint 5%% nagyon magas és 1%% nagyon alacsony; CGM aktív több mint 70%%." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Obiettivo: oltre il 70%% nell'intervallo; meno del 25%% sopra e del 4%% sotto; meno del 5%% molto alta e dell'1%% molto bassa; CGM attivo oltre il 70%%." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "目標:範囲内70%%超、範囲上25%%未満・範囲下4%%未満、非常に高い5%%未満・非常に低い1%%未満、CGM稼働70%%超。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Mål: over 70 %% i målområdet; under 25 %% over og 4 %% under; under 5 %% svært høyt og 1 %% svært lavt; CGM aktiv over 70 %%." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Doel: meer dan 70%% binnen bereik; minder dan 25%% erboven en 4%% eronder; minder dan 5%% zeer hoog en 1%% zeer laag; CGM meer dan 70%% actief." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Cel: ponad 70%% w zakresie; poniżej 25%% powyżej i 4%% poniżej; poniżej 5%% bardzo wysokich i 1%% bardzo niskich; CGM aktywny ponad 70%%." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meta: mais de 70%% no alvo; menos de 25%% acima e 4%% abaixo; menos de 5%% muito alto e 1%% muito baixo; CGM ativo mais de 70%%." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Țintă: peste 70%% în interval; sub 25%% peste și 4%% sub; sub 5%% foarte ridicat și 1%% foarte scăzut; CGM activ peste 70%%." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Цель: в диапазоне более 70%%; выше — менее 25%%, ниже — менее 4%%; очень высокая — менее 5%%, очень низкая — менее 1%%; CGM активен более 70%%." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cieľ: nad 70%% v rozsahu; pod 25%% nad a 4%% pod; pod 5%% veľmi vysoko a 1%% veľmi nízko; CGM aktívny nad 70%%." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mål: över 70 %% inom målområdet; under 25 %% över och 4 %% under; under 5 %% mycket högt och 1 %% mycket lågt; CGM aktiv över 70 %%." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "Hedef: aralıkta %%70'in üzeri; üstünde %%25'in, altında %%4'ün altı; çok yüksekte %%5'in, çok düşükte %%1'in altı; CGM aktif %%70'in üzeri." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Мета: у діапазоні понад 70%%; вище — менше 25%%, нижче — менше 4%%; дуже висока — менше 5%%, дуже низька — менше 1%%; CGM активний понад 70%%." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mục tiêu: trên 70%% trong khoảng; dưới 25%% trên khoảng và 4%% dưới khoảng; dưới 5%% rất cao và 1%% rất thấp; CGM hoạt động trên 70%%." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "." + "value" : "目标:范围内超过70%%;高于范围低于25%%,低于范围低于4%%;极高低于5%%,极低低于1%%;CGM 在线超过70%%。" } } } }, - "(+1 day)" : { - "comment" : "Text indicating that the stop time is set for the next day.", - "isCommentAutoGenerated" : true - }, - "**Tip: If glucose rises to >270 mg/dl,** check %@ to see if a bolus is recommended to bring your glucose back into range." : { - - }, - "**Tip:** Try exercising when your active insulin is close to zero at the start of an activity." : { - - }, - "**Try:** If you often experience low glucose, consider exercising earlier in the day before eating." : { - - }, - "**Try:** Reducing your meal bolus if you expect your glucose to drop." : { - - }, - "%@" : { - - }, - "%@ " : { - - }, - "%@ %@" : { - "comment" : "The format for an active custom preset. (1: preset symbol)(2: preset name)", + "Automatic %1$@" : { + "comment" : "Basal and bolus: bolus Loop gave automatically. (1: units, e.g. 5.4 U)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "تلقائي %1$@" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automaticky %1$@" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automatisk %1$@" } }, - "en" : { + "de" : { "stringUnit" : { - "state" : "new", - "value" : "%1$@ %2$@" + "state" : "translated", + "value" : "Automatisch %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automático %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automaattinen %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automatique %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "אוטומטי %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatikus %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automatico %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "自動 %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automatisk %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automatisch %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automatycznie %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automático %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@" + "value" : "Automat %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Автоматически %1$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automaticky %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Automatisk %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Otomatik %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Автоматично %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Tự động %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "自动 %1$@" } } } }, - "%@ absorbed" : { - "comment" : "Formats absorbed carb value", + "Automatic boluses" : { + "comment" : "Logbook row title: several automatic boluses in a row, folded into one row that lists them", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%@ استغرق" + "value" : "جرعات تلقائية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatické bolusy" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%@ optaget" + "value" : "Automatiske boluser" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%@ resorbiert" + "value" : "Automatische Boli" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%@ absorbido" + "value" : "Bolos automáticos" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%@ imeytynyt" + "value" : "Automaattiset boluset" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ absorbé(s)" + "value" : "Bolus automatiques" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%@ נספג" + "value" : "בולוסים אוטומטיים" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatikus bóluszok" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%@ assorbiti" + "value" : "Boli automatici" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 吸収済" + "value" : "自動ボーラス" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%@ absorbert" + "value" : "Automatiske boluser" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%@ geabsorbeerd" + "value" : "Automatische bolussen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%@ zaabsorbowane" + "value" : "Bolusy automatyczne" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%@ absorvida" + "value" : "Bolus automáticos" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%@ absorbiți" + "value" : "Bolusuri automate" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%@ усвоено" + "value" : "Автоматические болюсы" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%@ absorbované" + "value" : "Automatické bolusy" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%@ absorberat" + "value" : "Automatiska bolusdoser" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Emilen %@" + "value" : "Otomatik boluslar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Автоматичні болюси" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%@ được hấp thụ" + "value" : "Bolus tự động" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 已吸收" + "value" : "自动大剂量" } } } }, - "%@ of insulin" : { - - }, - "%@ read" : { - - }, - "%@ Recommended starting values" : { - - }, - "%@ remaining" : { - "comment" : "Estimated remaining duration with more than a minute", + "average per day" : { + "comment" : "Trends Basal and bolus card subtitle when the figures are averaged per day over the period", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المتوسط اليومي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "průměr za den" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%@ tilbage" + "value" : "gennemsnit pr. dag" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%@ verbleiben" + "value" : "Durchschnitt pro Tag" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%@ restante" + "value" : "promedio por día" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%@ jäljellä" + "value" : "keskiarvo päivässä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ restant" + "value" : "moyenne par jour" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%@ נותרו" + "value" : "ממוצע ליום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "napi átlag" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%@ rimanenti" + "value" : "media al giorno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "1日あたりの平均" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%@ gjenstår" + "value" : "gjennomsnitt per dag" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%@ resterend" + "value" : "gemiddeld per dag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pozostało %@" + "value" : "średnio dziennie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "média por dia" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%@ rămase" + "value" : "medie pe zi" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Осталось %@" + "value" : "в среднем за день" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "priemer za deň" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%@ återstår" + "value" : "medel per dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ kaldı" + "value" : "günlük ortalama" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "у середньому за день" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "trung bình mỗi ngày" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "剩余 %@" + "value" : "每日平均" } } } }, - "%@ U Total" : { - "comment" : "The subtitle format describing total insulin. (1: localized insulin total)", - "extractionState" : "stale", + "Basal %1$@, %2$@ percent" : { + "comment" : "VoiceOver: basal units and share. (1: units, 2: percentage number)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%@ وحدة بشكل كامل" + "value" : "القاعدية %1$@، %2$@ بالمئة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazál %1$@, %2$@ procent" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%@ E Total" + "value" : "Basal %1$@, %2$@ procent" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%@ IE gesamt" + "value" : "Basal %1$@, %2$@ Prozent" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U Totales" + "value" : "Basal %1$@, %2$@ por ciento" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U yhteensä" + "value" : "Basaali %1$@, %2$@ prosenttia" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U total" + "value" : "Basal %1$@, %2$@ pour cent" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U סה״כ" + "value" : "Basal %1$@, %2$@ אחוז" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@, %2$@ százalék" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U Totali" + "value" : "Basale %1$@, %2$@ percento" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "計 %@ 単位" + "value" : "ベーサル %1$@、%2$@ パーセント" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%@ E Totalt" + "value" : "Basal %1$@, %2$@ prosent" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%@ E totaal" + "value" : "Basaal %1$@, %2$@ procent" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%@ J łącznie" + "value" : "Podstawowy %1$@, %2$@ procent" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U Total" + "value" : "Basal %1$@, %2$@ por cento" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U total" + "value" : "Bazală %1$@, %2$@ la sută" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%@ всего ед" + "value" : "Базал %1$@, %2$@ процентов" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%@ j Celkom" + "value" : "Bazál %1$@, %2$@ percent" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%@ E totalt" + "value" : "Basal %1$@, %2$@ procent" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Toplam %@ Ü" + "value" : "Bazal %1$@, yüzde %2$@" } }, - "vi" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "%@ U Tổng cộng" + "value" : "Базал %1$@, %2$@ відсотків" } }, - "zh-Hans" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 单位 总量" + "value" : "Basal %1$@, %2$@ phần trăm" } - } - } - }, - "%@-%@" : { - "localizations" : { - "en" : { + }, + "zh-Hans" : { "stringUnit" : { - "state" : "new", - "value" : "%1$@-%2$@" + "state" : "translated", + "value" : "基础 %1$@,百分之 %2$@" } } } }, - "%@." : { - "comment" : "Appends a full-stop to a statement", - "extractionState" : "manual", + "Basal and bolus" : { + "comment" : "Trends and day page card title: insulin split into basal and bolus", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "القاعدية والبلعة" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Bazál a bolus" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basal og bolus" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basal und Bolus" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basal y bolo" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basaali ja bolus" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basal et bolus" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basal ו-Bolus" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal és bólus" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basale e bolo" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "ベーサルとボーラス" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%@ ." + "value" : "Basal og bolus" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basaal en bolus" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Insulina podstawowa i bolus" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basal e bolus" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Bazală și bolus" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Базал и болюс" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%@ ." + "value" : "Bazál a bolus" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basal och bolus" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Bazal ve bolus" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал і болюс" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "Basal và bolus" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%@." + "value" : "基础与大剂量" } } } }, - "%@%@ was unable to cancel your current temporary basal rate, which is higher than the new Max Basal limit you have set. This may result in higher insulin delivery than desired.\n\nConsider suspending insulin delivery manually and then immediately resuming to enact basal delivery with the new limit in place." : { - "comment" : "Alert text for failing to cancel temp basal (1: reason description, 2: app name)", + "Bolus %1$@, %2$@ percent" : { + "comment" : "VoiceOver: bolus units and share. (1: units, 2: percentage number)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "البلعة %1$@، %2$@ بالمئة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@, %2$@ procent" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@ kunne ikke annullere din nuværende midlertidige basalrate, som er højere end den nye Max basalgrænse, du har indstillet. Dette kan resultere i en højere insulintilførsel end ønsket.\n\nOvervej at suspendere insulintilførslen manuelt og derefter straks genoptage den for at iværksætte basaltilførslen med den nye grænse på plads." + "value" : "Bolus %1$@, %2$@ procent" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@ konnte Deine aktuelle temporäre Basalrate nicht abbrechen, da diese höher ist als die neue maximale Basalrate, die Du festgelegt hast. Dies kann zu einer höheren Insulinabgabe, als erwünscht führen.\n\nErwäge, die Insulinabgabe manuell zu unterbrechen und dann sofort wieder aufzunehmen, um die Basalabgabe mit dem neuen Grenzwert zu initiieren." + "value" : "Bolus %1$@, %2$@ Prozent" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ no pudo cancelar su basal temporal actual, que es más alta que el nuevo límite basal máximo que ha establecido. Esto puede resultar en una administración de insulina superior a la deseada. \n\n Considere suspender la administración de insulina manualmente y luego reanudarla de inmediato para activar la administración basal con el nuevo límite establecido." + "value" : "Bolo %1$@, %2$@ por ciento" } }, - "fr" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ n'a pas pu annuler votre débit basal temporaire actuel, qui est supérieur à la nouvelle limite basale max que vous avez définie. Cela peut entraîner une administration d'insuline plus élevée que souhaitée. \n\nEnvisagez de suspendre l'administration d'insuline manuellement, puis de reprendre immédiatement l'administration basale avec la nouvelle limite en place." + "value" : "Bolus %1$@, %2$@ prosenttia" } }, - "it" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@ non sono stati in grado di cancellare la tua attuale basale temporanea, che è più elevata di quella impostata come nuovo limite massimo di basale. Questo potrebbe comportare una maggiore infusione d'insulina di quanto desiderato. \n\nConsidera di sospendere manualmente l'erogazione d'insulina e quindi di riattivarla immediatamente per attivare l'erogazione d'insulina basale con il corretto limite impostato." + "value" : "Bolus %1$@, %2$@ pour cent" } }, - "nb" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ kunne ikke avbryte den nåværende midlertidige basaldosen, som er høyere enn den nye maksimale basalgrensen du har angitt. Dette kan føre til høyere insulintilførsel enn ønsket. \n\n Vurder å avbryte insulintilførselen manuelt og deretter umiddelbart gjenoppta for å innføre basaltilførsel med den nye grensen på plass." + "value" : "Bolus %1$@, %2$@ אחוז" } }, - "nl" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "%@%@ kon je huidige tijdelijke basaalstand niet annuleren, die hoger is dan de nieuwe maximale basaallimiet die je hebt ingesteld. Dit kan leiden tot een hogere insulinetoediening dan gewenst. \n\nOverweeg om de insulinetoediening handmatig te onderbreken en dan direct het hervatten van de basaaltoediening uit te laten voeren met de nieuwe geldende limiet." + "value" : "Bólus %1$@, %2$@ százalék" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ nie mógł anulować bieżącej tymczasowej dawki podstawowej, która jest wyższa niż nowy ustawiony limit maksymalnej dawki podstawowej. Może to skutkować wyższym niż pożądane podawaniem insuliny. \n\n Rozważ ręczne wstrzymanie podawania insuliny, a następnie natychmiastowe wznowienie podawania dawki podstawowej z obowiązującym nowym limitem." + "value" : "Bolo %1$@, %2$@ percento" } }, - "ro" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ nu a putut anula rata bazală temporară actuală, care este mai mare decât noua limită bazală maximă pe care ați setat-o. Acest lucru poate duce la o administrare de insulină mai mare decât se dorește. \n\nLuați în considerare suspendarea manuală a administrării insulinei și apoi reluarea imediată pentru a pune în aplicare administrarea bazală cu noua limită în vigoare." + "value" : "ボーラス %1$@、%2$@ パーセント" } }, - "ru" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@ не смог отменить вашу текущую ВБС, которая превышает установленный вами новый предел максимальной ВБС. Это может привести к большему количеству подаваемого инсулина, чем хотелось бы.\n\nРассмотрите возможность приостановить введение инсулина вручную, а затем немедленно возобновить введение базального инсулина с новым установленным лимитом." + "value" : "Bolus %1$@, %2$@ prosent" } }, - "sk" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@ nedokázal zrušiť vašu aktuálnu dočasnú bazálnu dávku, ktorá je vyššia ako nový maximálny bazálny limit, ktorý ste nastavili. To môže viesť k vyššiemu dodávaniu inzulínu, ako je požadované.\n\nZvážte ručné pozastavenie podávania inzulínu a následné okamžité obnovenie, aby ste uplatnili novým bazálny limit." + "value" : "Bolus %1$@, %2$@ procent" } }, - "tr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ , ayarladığınız yeni Maks Bazal limitinden daha yüksek olan mevcut geçici bazal oranınızı iptal edemedi. Bu, istenenden daha yüksek insülin iletimi ile sonuçlanabilir. \n\n İnsülin iletimini manuel olarak askıya almayı ve ardından yeni limit geçerliyken bazal iletimi etkinleştirmek için hemen devam etmeyi düşünün." + "value" : "Bolus %1$@, %2$@ procent" } }, - "zh-Hans" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%@%@ 无法取消当前的临时基础率,该基础率高于您新设定的最大基础率上限。这可能导致胰岛素输注量高于预期。\n\n建议您手动暂停胰岛素输注,然后立即恢复,以便根据新的上限重新执行基础输注。" + "value" : "Bolus %1$@, %2$@ por cento" } - } - } - }, - "%1@%2@" : { - "comment" : "Adds a full-stop to a statement (1: statement, 2: full stop character)", - "localizations" : { - "de" : { + }, + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$1@%2$2@" + "value" : "Bolus %1$@, %2$@ la sută" } }, - "en" : { + "ru" : { "stringUnit" : { - "state" : "new", - "value" : "%1$1@%2$2@" + "state" : "translated", + "value" : "Болюс %1$@, %2$@ процентов" } }, - "fr" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$1@%2$2@" + "value" : "Bolus %1$@, %2$@ percent" } }, - "he" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$1@%2$2@" + "value" : "Bolus %1$@, %2$@ procent" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$1@%2$2@" + "value" : "Bolus %1$@, yüzde %2$@" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$1@%2$2@" + "value" : "Болюс %1$@, %2$@ відсотків" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$1@%2$2@" + "value" : "Bolus %1$@, %2$@ phần trăm" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$1@%2$2@" + "value" : "大剂量 %1$@,百分之 %2$@" } } } }, - "%1$@ – %2$@ %3$@" : { - "comment" : "Format string for glucose target range. (1: Min target)(2: Max target)(3: glucose unit)", - "extractionState" : "manual", + "Boluses" : { + "comment" : "Trends summary tile for a one-day period: how many manual boluses were given that day", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "الجرعات" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Bolusy" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Boluser" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Boli" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Bolos" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Boluksia" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Bolus" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "בולוסים" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bóluszok" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Boli" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "ボーラス" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Boluser" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ - %2$@ %3$@" + "value" : "Bolussen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Bolusy" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Bolus" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Bolusuri" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Болюсы" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Bolusy" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Bolusdoser" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Bolus" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюси" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "Liều bolus" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ – %2$@ %3$@" + "value" : "大剂量次数" } } } }, - "%1$@ %2$@" : { - "comment" : "Format string combining carb entry quantity and absorption time emoji", + "CGM data covers %1$@." : { + "comment" : "Trends Summary note when glucose readings start partway through the period. (1: days covered, e.g. 5 of 14 days)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "بيانات CGM تغطي %1$@." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data CGM pokrývají %1$@." } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "CGM-data dækker %1$@." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "CGM-Daten decken %1$@ ab." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Los datos de CGM cubren %1$@." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "CGM-data kattaa %1$@." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Les données CGM couvrent %1$@." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "נתוני CGM מכסים %1$@." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM-adat: %1$@." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "I dati CGM coprono %1$@." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "CGMデータ:%1$@。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "CGM-data dekker %1$@." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "CGM-gegevens beslaan %1$@." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Dane CGM obejmują %1$@." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Os dados de CGM cobrem %1$@." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@%2$@" + "value" : "Datele CGM acoperă %1$@." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Данные CGM: %1$@." } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Údaje CGM pokrývajú %1$@." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "CGM-data täcker %1$@." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "CGM verisi: %1$@." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дані CGM: %1$@." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@" + "value" : "Dữ liệu CGM bao phủ %1$@." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM 数据覆盖 %1$@。" } } } }, - "%1$@ %2$@/U" : { - "comment" : "Format string for carb ratio average. (1: value)(2: carb unit)", - "extractionState" : "manual", + "Custom" : { + "comment" : "Carb entry absorption choice Other, before it is chosen: you set the food and absorption time yourself", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/وحدة" + "value" : "مخصص" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/E" + "value" : "Vlastní" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/IE" + "value" : "Brugerdefineret" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "Eigene" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "Personalizado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "Oma" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "Personnalisé" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "מותאם אישית" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egyéni" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "Personalizzato" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "カスタム" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ /E" + "value" : "Egendefinert" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ /E" + "value" : "Aangepast" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/J" + "value" : "Własne" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "Personalizado" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "Personalizat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/ед" + "value" : "Своё" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ /j" + "value" : "Vlastné" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/E" + "value" : "Anpassad" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/Ü" + "value" : "Özel" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Власне" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/U" + "value" : "Tùy chỉnh" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@/单位" + "value" : "自定义" } } } }, - "%1$@ + %2$@" : { - "comment" : "Format string combining carb entry time and absorption time\nFormats (1: carb start time) and (2: carb absorption duration)", + "Eaten" : { + "comment" : "Carb entry section title: when the food was eaten", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "وقت الأكل" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Snězeno" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Spist" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Gegessen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Comido" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Syöty" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Mangé" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "נאכל" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elfogyasztva" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Mangiato" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "食べた時刻" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Spist" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Gegeten" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Zjedzono" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Consumido" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Consumat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Съедено" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Zjedené" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Ätit" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Yenme zamanı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "З'їдено" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "Đã ăn" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ + %2$@" + "value" : "进食时间" } } } }, - "%1$@ also reads insulin data from other apps in Apple Health. Apple Health does not report whether an app may read data, so read access can't be shown here." : { - "comment" : "Health access reading explanation (1: app name)" - }, - "%1$@ APP SOUNDS" : { - "comment" : "App sounds title text (1: app name)", - "extractionState" : "stale", + "Fast" : { + "comment" : "Carb entry absorption choice: food that absorbs quickly, such as sweets", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ APP LYDE" + "value" : "سريع" } }, - "it" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ SUONI DELL'APP" + "value" : "Rychle" } }, - "nb" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ APP-LYDER" + "value" : "Hurtig" } }, - "pl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ DŹWIĘKI APLIKACJI" + "value" : "Schnell" } }, - "ru" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ ЗВУКИ ПРИЛОЖЕНИЯ" + "value" : "Rápido" } - } - } - }, - "%1$@ cannot turn your iPhone's volume up for you. Make sure your volume is turned up — especially overnight — or you may not hear urgent alarms. The Mute All App Sounds feature also silences these alarms while it is active." : { - "comment" : "Critical alert audio fallback callout message (1: app name)" - }, - "%1$@ has been active for more than 24 hours. Make sure you still want it enabled, or turn it off in the app." : { - "comment" : "Active preset reminder alert background body. (1: preset name)" - }, - "%1$@ has been active for more than 24 hours. Make sure you still want it enabled, or turn it off." : { - "comment" : "Active preset reminder alert foreground body. (1: preset name)" - }, - "%1$@ has set your correction range to 110 mg/dL or higher." : { - "comment" : "The format string for the high insulin needs preset warning text on the preset detent screen when stopping a preset. (1: app name)" - }, - "%1$@ is operating with Closed Loop in the OFF position. Your pump and CGM will continue operating, but the app will not adjust dosing automatically." : { - "comment" : "Alert message for closed loop off informational modal. (1: app name)", - "localizations" : { - "da" : { + }, + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kører med Lukket Loop i positionen OFF. Din pumpe og CGM fortsætter med at fungere, men appen justerer ikke doseringen automatisk." + "value" : "Nopea" } }, - "de" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ arbeitet mit geschlossenem Regelkreis in der AUS-Position. Deine Pumpe und CGM funktionieren weiter, aber die App passt die Dosierung nicht automatisch an." + "value" : "Rapide" } }, - "es" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ está funcionando con Circuito Cerrado en la posición APAGADO. Su bomba y CGM seguirán funcionando, pero la aplicación no ajustará la dosis automáticamente." + "value" : "מהיר" } }, - "fr" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ fonctionne avec la boucle fermée en position ARRÊT. Votre pompe et votre CGM continueront de fonctionner, mais l'application n'ajustera pas automatiquement le dosage." + "value" : "Gyors" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ è in funzione con Loop chiuso disattivato. La pompa e il CGM continueranno a funzionare, ma l'applicazione non regolerà automaticamente il dosaggio." + "value" : "Veloce" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "速い" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ opererer med Lukket Loop i AV-posisjon. Pumpen og CGM vil fortsette å fungere, men appen vil ikke justere doseringen automatisk." + "value" : "Rask" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ werkt met Actieve loop UIT. Je pomp en CGM blijven werken, maar de app past de dosering niet automatisch aan." + "value" : "Snel" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ działa z zamkniętą pętlą w pozycji OFF. Twoja pompa i CGM będą nadal działać, ale aplikacja nie będzie automatycznie dostosowywać insuliny." + "value" : "Szybko" } }, - "ro" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ operează cu bucla închisă în poziția OPRIT. Pompa și senzorul de glicemie vor continua să funcționeze, dar aplicația nu va ajusta automat dozarea." + "value" : "Rápido" } }, - "ru" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ работает с замкнутым циклом в положении ВЫКЛ. Ваша помпа и CGM будут продолжать работать, но приложение не будет регулировать дозировку автоматически." + "value" : "Rapid" } }, - "tr" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ , KAPALI konumda Kapalı Döngü ile çalışıyor. Pompanız ve CGM çalışmaya devam edecek, ancak uygulama dozajı otomatik olarak ayarlamayacaktır." + "value" : "Быстро" } }, - "zh-Hans" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ 当前处于非闭环模式。胰岛素泵和连续血糖监测仪仍将正常运行,但应用程序不会自动调整胰岛素剂量。" + "value" : "Rýchlo" } - } - } - }, - "%1$@ is unable to clear the alert from your device" : { - "comment" : "Message for alert shown when alert acknowledgement fails for a device, and the device does not provide a LocalizedError. (1: app name)", - "localizations" : { - "da" : { + }, + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kan ikke slette advarslen fra din enhed" + "value" : "Snabb" } }, - "de" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kann die Benachrichtigung nicht von Deinem Gerät löschen" + "value" : "Hızlı" } }, - "es" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ no puede borrar la alerta de su dispositivo" + "value" : "Швидко" } }, - "fr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ ne parvient pas à supprimer l'alerte de votre dispositif." + "value" : "Nhanh" } }, - "it" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ non è in grado di cancellare l'avviso dal tuo dispositivo" + "value" : "快" } - }, - "nb" : { + } + } + }, + "How fast it absorbs" : { + "comment" : "Carb entry section title: choose how quickly the food's carbs absorb", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kan ikke fjerne varselet fra enheten din" + "value" : "سرعة الامتصاص" } }, - "nl" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kan de melding niet wissen van je apparaat" + "value" : "Jak rychle se vstřebá" } }, - "pl" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ nie może usunąć alertu z Twojego urządzenia" + "value" : "Hvor hurtigt det optages" } }, - "ro" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ nu poate șterge alerta de pe dispozitiv" + "value" : "Wie schnell es aufgenommen wird" } }, - "ru" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ не удается удалить предупреждение с вашего устройства" + "value" : "Qué tan rápido se absorbe" } }, - "tr" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ , uyarıyı cihazınızdan silemiyor" + "value" : "Kuinka nopeasti imeytyy" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$@ 无法清除您设备上的警报。" - } - } - } - }, - "%1$@ is unable to communicate with your insulin pump. The app will continue trying to reach your pump, but insulin delivery information cannot be updated and no automation can continue.\nYou can wait several minutes to see if the issue resolves or tap the button below to learn more about other options." : { - "comment" : "Message for alert shown when delivery status is uncertain. (1: app name)", - "localizations" : { - "da" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kan ikke kommunikere med insulinpumpen. Loop vil fortsætte med at forsøge at kommunikere med din pumpe, men insulinafgivelsesoplysninger kan ikke opdateres og ingen automatisering kan fortsætte.\nDu kan vente et par minutter for at se, om problemet bliver løst, eller tryk på knappen nedenfor for at få mere at vide om andre muligheder." + "value" : "Vitesse d'absorption" } }, - "de" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kann nicht mit Deiner Insulinpumpe kommunizieren. Die App versucht weiterhin, Deine Pumpe zu erreichen, aber die Informationen zur Insulinabgabe können nicht aktualisiert werden und die Automatisierung kann nicht fortgesetzt werden.\nDu kannst einige Minuten warten, um zu sehen, ob das Problem behoben ist, oder auf die Schaltfläche unten tippen, um mehr über andere Optionen zu erfahren." + "value" : "באיזו מהירות נספג" } }, - "es" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ no puede comunicarse con tu bomba de insulina. La aplicación continuará intentando llegar a tu bomba, pero la información de entrega de insulina no se puede actualizar y ninguna automatización puede continuar.\nPuedes esperar varios minutos para ver si el problema resuelve o pulsa el botón de abajo para saber más sobre otras opciones." + "value" : "Milyen gyorsan szívódik fel" } }, - "fi" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ ei pysty kommunikoimaan insuliinipumpun kanssa. Sovellus yrittää edelleen yhdistää pumppuun, mutta insuliininannostelun tiedot eivät päivity, eikä automatiikka ole päällä.\nVoit odottaa muutaman minuutin nähdäksesi ratkeaako ongelma, tai voit napauttaa alla olevaa painiketta saadaksesi lisätietoja muista vaihtoehdoista." + "value" : "Velocità di assorbimento" } }, - "fr" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ ne parvient pas à communiquer avec votre pompe à insuline. L’application continuera d’essayer d’atteindre votre pompe, mais les informations sur l’administration d’insuline ne peuvent pas être mises à jour et aucune automatisation ne peut continuer.\nVous pouvez attendre quelques minutes pour voir si le problème est résolu ou appuyer sur le bouton ci-dessous pour en savoir plus sur les autres options." + "value" : "吸収の速さ" } }, - "it" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ non riesce a comunicare con la pompa. L'app continuerà a provare a contattare la pompa, ma le informazioni sull'erogazione dell'insulina non possono essere aggiornate e l'automazione non può proseguire. \nPuoi attendere alcuni minuti per vedere se il problema si risolve oppure toccare il pulsante qui sotto per saperne di più sulle altre opzioni." + "value" : "Hvor raskt det tas opp" } }, - "nb" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kan ikke kommunisere med insulinpumpen. Appen vil fortsette å prøve å nå pumpen din, men insulintilførselsinformasjon kan ikke oppdateres og ingen automatisering kan fortsette.\n Du kan vente flere minutter for å se om problemet løser seg eller trykke på knappen nedenfor for å lære mer om andre alternativer." + "value" : "Hoe snel het wordt opgenomen" } }, - "nl" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kan niet communiceren met je insulinepomp. De app blijft proberen je pomp te bereiken, maar de insulinetoedieningsinformatie kan niet worden bijgewerkt en automatisering kan niet plaatsvinden.\nJe kunt enkele minuten wachten om te zien of het probleem is opgelost of tik op de onderstaande knop voor meer informatie over andere opties." + "value" : "Jak szybko się wchłania" } }, - "pl" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ nie może skomunikować się z Twoją pompą insulinową. Aplikacja będzie nadal próbowała połączyć się z pompą, ale nie można aktualizować informacji o podawaniu insuliny i nie można kontynuować automatyzacji.\n Możesz poczekać kilka minut, aby sprawdzić, czy problem został rozwiązany, lub nacisnąć poniższy przycisk, aby dowiedzieć się więcej o innych opcjach." + "value" : "Velocidade de absorção" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ nu poate comunica cu pompa de insulină. Aplicația va continua să încerce să comunice cu pompa, dar informațiile despre administrarea insulinei nu pot fi actualizate și automatizarea nu poate continua.\nPuteți aștepta câteva minute pentru a vedea dacă problema se rezolvă sau apăsați butonul de mai jos pentru a afla mai multe despre alte opțiuni." + "value" : "Cât de repede se absoarbe" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ не может связаться с вашей инсулиновой помпой. Приложение будет продолжать попытки связаться с вашей помпой, но информация о доставке инсулина не может быть обновлена, и автоматизация не может продолжаться.\nВы можете подождать несколько минут и посмотреть, разрешится ли проблема, или нажать кнопку ниже, чтобы узнать о других возможностях." + "value" : "Скорость усвоения" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ nedokáže komunikovať s vašou inzulínovou pumpou. Aplikácia sa bude naďalej pokúšať kontaktovať vašu pumpu, ale informácie o podávaní inzulínu nemožno aktualizovať a nemôže pokračovať žiadna automatizácia.\nMôžete počkať niekoľko minút, aby ste zistili, či sa problém vyriešil, alebo klepnutím na tlačidlo nižšie sa dozviete viac o ďalších možnostiach." + "value" : "Ako rýchlo sa vstrebe" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kan inte kommunicera med din insulinpump. Appen kommer att fortsätta att försöka nå din pump, men under tiden kan information om insulintillförsel inte uppdateras och automatisering inte fortsätta.\nDu kan vänta flera minuter för att se om problemet löser sig eller klicka på knappen nedan för att läsa mer om andra alternativ." + "value" : "Hur snabbt det tas upp" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ insülin pompanızla iletişim kuramıyor. Uygulama pompanıza ulaşmaya çalışmaya devam edecek, ancak insülin iletim bilgileri güncellenemeyecek ve hiçbir otomasyon devam edemeyecektir.\nSorunun çözülüp çözülmediğini görmek için birkaç dakika bekleyebilir veya diğer seçenekler hakkında daha fazla bilgi edinmek için aşağıdaki butona dokunabilirsiniz." + "value" : "Ne kadar hızlı emilir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Швидкість засвоєння" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tốc độ hấp thu" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ 无法与您的胰岛素泵通信。应用将继续尝试连接胰岛素泵,但当前无法更新胰岛素输注信息,也无法继续自动化操作。\n\n您可以等待几分钟以观察问题是否自动恢复,或点击下方按钮了解其他可选操作。" + "value" : "吸收速度" } } } }, - "%1$@ Still Active" : { - "comment" : "The format title for the preset still active alert. (1: preset name)" - }, - "%1$@ Time Settings Need Attention" : { - "comment" : "Time change alert title", + "Loop · %1$@ · tap to list" : { + "comment" : "Logbook folded automatic boluses row subtitle: Loop gave them, the time span they cover, and tapping lists them. (1: time range, e.g. 15:08 – 16:14)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · اضغط للعرض" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · klepnutím zobrazíte" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Tidsindstillinger kræver opmærksomhed" + "value" : "Loop · %1$@ · tryk for at se listen" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Zeiteinstellungen erfordern Aufmerksamkeit" + "value" : "Loop · %1$@ · zum Auflisten tippen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ La configuración de la hora necesita atención" + "value" : "Loop · %1$@ · toca para ver la lista" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · napauta nähdäksesi" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Paramètres d'heure requierent une attention" + "value" : "Loop · %1$@ · touchez pour la liste" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ הגדרות השעה דורשות תשומת לב" + "value" : "Loop · %1$@ · הקש להצגה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · koppintson a listához" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Le impostazioni dell'orario richiedono attenzione" + "value" : "Loop · %1$@ · tocca per l'elenco" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · タップして一覧" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Tidsinnstillinger trenger oppmerksomhet" + "value" : "Loop · %1$@ · trykk for å se listen" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Tijdinstellingen hebben aandacht nodig" + "value" : "Loop · %1$@ · tik voor lijst" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Ustawienia czasu wymagają uwagi" + "value" : "Loop · %1$@ · stuknij, aby wyświetlić" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · toque para ver a lista" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Setările de timp necesită atenție" + "value" : "Loop · %1$@ · atingeți pentru listă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Настройки времени требуют внимания" + "value" : "Loop · %1$@ · нажмите для списка" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · ťuknutím zobrazíte" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · tryck för att visa" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Zaman Ayarlarına Dikkat Edilmesi Gerekiyor" + "value" : "Loop · %1$@ · listelemek için dokunun" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · торкніться для списку" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %1$@ · chạm để xem" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ 时间设置需要注意" + "value" : "Loop · %1$@ · 轻点查看列表" } } } }, - "%1$@ U" : { - "comment" : "Reservoir entry (1: volume value)", + "Manual %1$@" : { + "comment" : "Basal and bolus: bolus the person gave. (1: units, e.g. 16.2 U)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يدوي %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ručně %1$@" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E" + "value" : "Manuel %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ IE" + "value" : "Manuell %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U" + "value" : "Manual %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U" + "value" : "Manuaalinen %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U" + "value" : "Manuel %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "U %1$@" + "value" : "ידני %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kézi %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U" + "value" : "Manuale %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "手動 %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E" + "value" : "Manuell %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E" + "value" : "Handmatig %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ J" + "value" : "Ręcznie %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manual %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U" + "value" : "Manual %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Ед." + "value" : "Вручную %1$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%@ j" + "value" : "Ručne %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E" + "value" : "Manuell %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Ü" + "value" : "Manuel %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вручну %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thủ công %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U" + "value" : "手动 %1$@" } } } }, - "%1$@ U left" : { - "comment" : "Low reservoir alert format string. (1: Number of units remaining)", - "extractionState" : "manual", + "Medium" : { + "comment" : "Carb entry absorption choice: a typical mixed meal", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ وحدة متبقية" + "value" : "متوسط" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E tilbage" + "value" : "Středně" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ IE verbleibend" + "value" : "Middel" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U left" + "value" : "Mittel" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U restantes" + "value" : "Medio" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U jäljellä" + "value" : "Keskinopea" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U restantes" + "value" : "Moyen" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U נותרו" + "value" : "בינוני" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Közepes" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U rimaste" + "value" : "Medio" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "残 %1$@単位" + "value" : "普通" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E igjen" + "value" : "Middels" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E over" + "value" : "Gemiddeld" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ J pozostało" + "value" : "Średnio" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U restante" + "value" : "Médio" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U rămase" + "value" : "Mediu" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Ед осталось" + "value" : "Средне" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Zostáva %1$@ j" + "value" : "Stredne" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E kvar" + "value" : "Medel" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Ü kaldı" + "value" : "Orta" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Середньо" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U còn lại" + "value" : "Trung bình" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ 单位 剩余" + "value" : "中" } } } }, - "%1$@ U left: %2$@" : { - "comment" : "Low reservoir alert with time remaining format string. (1: Number of units remaining)(2: approximate time remaining)", - "extractionState" : "manual", + "Scheduled %1$@" : { + "comment" : "Basal and bolus: what the basal schedule delivers over the same time, under the basal row. (1: units, e.g. 18.0 U)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ وحدة متبقية: %2$@" + "value" : "المجدول %1$@" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E tilbage: %2$@" + "value" : "Plánovaný %1$@" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ IE verbleibend: %2$@" + "value" : "Planlagt %1$@" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U left: %2$@" + "value" : "Geplant %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U restantes: %2$@" + "value" : "Programado %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U jäljellä: %2$@" + "value" : "Ohjelmoitu %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U restantes: %2$@" + "value" : "Programmé %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U נותרו: %2$@" + "value" : "מתוזמן %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ütemezett %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U rimaste: %2$@" + "value" : "Programmato %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "残 %1$@単位: %2$@" + "value" : "スケジュール %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E gjenstår: %2$@" + "value" : "Planlagt %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E over: %2$@" + "value" : "Gepland %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ J pozostało: %2$@" + "value" : "Zaplanowane %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U restante: %2$@" + "value" : "Programada %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U rămase: %2$@" + "value" : "Programat %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Ед осталось: %2$@" + "value" : "Запланировано %1$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Zostáva %1$@ j: %2$@" + "value" : "Plánovaný %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E kvar: %2$@" + "value" : "Schemalagd %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Ü kalan: %2$@" + "value" : "Planlanan %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "За розкладом %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U còn lại: %2$@" + "value" : "Theo lịch %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ 单位 剩余: %2$@" + "value" : "预设 %1$@" } } } }, - "%1$@ U/hour @ %2$@" : { - "comment" : "The format for recommended temp basal rate and time. (1: localized rate number)(2: localized time)", - "extractionState" : "manual", + "Slow" : { + "comment" : "Carb entry absorption choice: food that absorbs slowly, such as pizza", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ وحدة/ساعة @ %2$@" + "value" : "بطيء" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E/time @ %2$@" + "value" : "Pomalu" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ IE/h @ %2$@" + "value" : "Langsom" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U/hour @ %2$@" + "value" : "Langsam" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U/hora @ %2$@" + "value" : "Lento" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U/h klo %2$@" + "value" : "Hidas" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U/heure @ %2$@" + "value" : "Lent" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ יח׳/שעה @ %2$@" + "value" : "איטי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lassú" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U/ora @ %2$@" + "value" : "Lento" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U/時 @ %2$@" + "value" : "遅い" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E/timen @ %2$@" + "value" : "Langsom" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E/uur @ %2$@" + "value" : "Langzaam" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ J/godzinę @ %2$@" + "value" : "Wolno" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U/hora @ %2$@" + "value" : "Lento" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U/oră @ %2$@" + "value" : "Lent" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ ед/час @ %2$@" + "value" : "Медленно" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ j/hod @ %2$@" + "value" : "Pomaly" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ E/h @ %2$@" + "value" : "Långsam" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Ü/saat @ %2$@" + "value" : "Yavaş" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Повільно" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ U/giờ @ %2$@" + "value" : "Chậm" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ 单位/小时 @ %2$@" + "value" : "慢" } } } }, - "%1$@ v%2$@" : { - "comment" : "The format string for the app name and version number. (1: bundle name)(2: bundle version)", + "this day" : { + "comment" : "Trends Basal and bolus card subtitle when the period is one complete day", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "هذا اليوم" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "tento den" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "denne dag" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "dieser Tag" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "este día" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "tämä päivä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "ce jour" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "יום זה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "ez a nap" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "questo giorno" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "この日" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v %2$@" + "value" : "denne dagen" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "deze dag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "ten dzień" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "este dia" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "această zi" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ версии %2$@" + "value" : "этот день" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v %2$@" + "value" : "tento deň" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "denna dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "bu gün" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "цей день" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "ngày này" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ v%2$@" + "value" : "当天" } } } }, - "%1$@ will actively adjust your insulin dosing in response to your glucose as often as every 5 minutes." : { - "comment" : "message when automation is on and the glucose value is fresh (1: app name)" - }, - "%1$@ will continue trying to restore automation, but check for potential communication issues with your CGM or insulin pump." : { - "comment" : "message when automation is on and pump is in signal loss (1: app name)\nmessage when automation is on and the glucose value is not fresh (1: app name)" - }, - "%1$@ will continue trying to restore automation, but check for potential communication issues with your CGM.\n\nIn the meantime, your pump is still able to deliver insulin." : { - "comment" : "message when automation is on and CGM is in signal loss (1: app name)" - }, - "%1$@ will set your correction range to 110 mg/dL or higher when this preset is enabled." : { - "comment" : "The format string for the high insulin needs preset warning text on the preset detent screen when starting a preset. (1: app name)" - }, - "%1$@ will stop working in %2$@. You will need to rebuild before that." : { - "comment" : "Format string for body for notification of upcoming expiration. (1: app name) (2: amount of time until expiration", + "Time" : { + "comment" : "Carb entry row label: the exact time the food was eaten", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ holder op med at fungere i %2$@. Du bliver nødt til at rebuilde før det." + "value" : "الوقت" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ funktioniert in %2$@ nicht mehr. Sie müssen vorher einen Neuaufbau durchführen." + "value" : "Čas" } }, - "fr" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ cessera de fonctionner dans %2$@. Il vous faudra recompiler avant cette échéance." + "value" : "Tidspunkt" } }, - "it" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ smetterà di funzionare tra %2$@. Prima di allora, sarà necessario ricostruirlo." + "value" : "Uhrzeit" } }, - "nb" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ vil slutte å fungere i %2$@. Du må gjenoppbygge før det." + "value" : "Hora" } }, - "nl" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ stopt over %2$@ met werken. Bouw de app vóór die tijd opnieuw." + "value" : "Aika" } }, - "pl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ przestanie działać w %2$@. Konieczna będzie wcześniejsza odbudowa." + "value" : "Heure" } }, - "ro" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ va înceta să funcționeze în %2$@. Va trebui să reconstruiți sistemul înainte de asta." + "value" : "שעה" } }, - "ru" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ перестанет работать в %2$@. До этого времени необходимо пересобрать приложение заново." + "value" : "Időpont" } }, - "zh-Hans" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@将在%2$@停止工作。您需要在此之前重建。" + "value" : "Ora" } - } - } - }, - "%1$@ will stop working in %2$@. You will need to update before that, with a new provisioning profile." : { - "comment" : "Format string for body for notification of upcoming provisioning profile expiration. (1: app name) (2: amount of time until expiration", - "localizations" : { - "da" : { + }, + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ holder op med at fungere i %2$@. Du skal opdatere inden da med en ny provisioneringsprofil." + "value" : "時刻" } }, - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ funktioniert nicht mehr in %2$@. Du musst vor Ablauf mit einem neuen Bereitstellungsprofil aktualisieren." + "value" : "Tidspunkt" } }, - "es" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ dejará de funcionar en %2$@ . Deberá actualizar antes de eso, con un nuevo perfil de aprovisionamiento." + "value" : "Tijd" } }, - "fr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ cessera de fonctionner dans %2$@ . Vous devrez mettre à jour avant cela, avec un nouveau profil de provisioning." + "value" : "Godzina" } }, - "it" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ smetterà di funzionare tra %2$@. Prima di allora, sarà necessario effettuare l'aggiornamento con un nuovo profilo di provisioning." + "value" : "Hora" } }, - "nb" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ slutter å fungere om %2$@ . Du må oppdatere før det, med en ny klargjøringsprofil." + "value" : "Ora" } }, - "nl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ stopt met werken in %2$@. Je zult eerder moeten updaten, met een nieuw beschikbaargesteld profiel." + "value" : "Время" } }, - "pl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ przestanie działać za %2$@ . Wcześniej konieczna będzie aktualizacja przy użyciu nowego profilu udostępniania." + "value" : "Čas" } }, - "ro" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ nu va mai funcționa în %2$@. Va trebui să actualizați înainte de aceasta, cu un nou profil de asigurare a accesului." + "value" : "Tid" } }, - "ru" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ перестанет работать в %2$@. Вам нужно будет обновить его до этого, используя новую подпись." + "value" : "Saat" } }, - "tr" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ %2$@ içinde çalışmayı durduracaktır. Bundan önce yeni bir provizyon profili ile güncelleme yapmanız gerekecektir." + "value" : "Час" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thời gian" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ 在 %2$@中将无法正常工作。您需要在该版本发布之前,使用新的配置文件进行更新。" + "value" : "时间" } } } }, - "%1$@: %2$@" : { - "comment" : "Formats (1: carb value) and (2: food type)", + "today so far" : { + "comment" : "Trends Basal and bolus card subtitle when the figures are today's total so far", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "اليوم حتى الآن" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "dnes zatím" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "i dag indtil nu" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "heute bisher" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "hoy hasta ahora" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "tänään tähän mennessä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "aujourd'hui jusqu'ici" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "היום עד כה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "ma eddig" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "oggi finora" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "今日のこれまで" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ : %2$@" + "value" : "i dag så langt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ : %2$@" + "value" : "vandaag tot nu toe" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "dziś do tej pory" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "hoje até agora" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "azi până acum" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "сегодня на данный момент" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ : %2$@" + "value" : "dnes zatiaľ" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "hittills i dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "bugün şu ana kadar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "сьогодні наразі" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "hôm nay đến giờ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@" + "value" : "今日至今" } } } }, - "%1$@: %2$@ %3$@" : { - "comment" : "Description of a basal temp basal dose entry (1: title for dose type, 2: value (? if no value) in bold, 3: unit)\nDescription of a bolus dose entry (1: title for dose type, 2: value (? if no value) in bold, 3: unit)", + "Today so far %1$@, usually %2$@ by %3$@." : { + "comment" : "Trends Insulin per day footnote: today's insulin so far against the median by this time of day over the last 14 days. (1: today's units, 2: usual units, 3: time of day)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "اليوم حتى الآن %1$@، وعادةً %2$@ بحلول %3$@." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dnes zatím %1$@, obvykle %2$@ do %3$@." + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "I dag indtil nu %1$@, normalt %2$@ kl. %3$@." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "Heute bisher %1$@, üblicherweise %2$@ bis %3$@." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "Hoy hasta ahora %1$@, normalmente %2$@ a las %3$@." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "Tänään tähän mennessä %1$@, yleensä %2$@ klo %3$@ mennessä." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "Aujourd'hui jusqu'ici %1$@, d'habitude %2$@ à %3$@." } }, - "it" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "היום עד כה %1$@, בדרך כלל %2$@ עד %3$@." } }, - "nb" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ : %2$@ %3$@" + "value" : "Ma eddig %1$@, általában %2$@ ilyenkorra (%3$@)." } }, - "nl" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "Oggi finora %1$@, di solito %2$@ entro le %3$@." } }, - "pl" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "今日のこれまで%1$@、通常は%3$@までに%2$@。" } }, - "ro" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "I dag så langt %1$@, vanligvis %2$@ innen %3$@." } }, - "ru" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "Vandaag tot nu toe %1$@, meestal %2$@ om %3$@." } }, - "sv" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "Dziś do tej pory %1$@, zwykle %2$@ do %3$@." } }, - "tr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" + "value" : "Hoje até agora %1$@, normalmente %2$@ até %3$@." } }, - "zh-Hans" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@: %2$@ %3$@" - } - } - } - }, - "%lld" : { - "comment" : "A label displaying the playback speed. The argument is the playback speed.", - "isCommentAutoGenerated" : true - }, - "%lld min" : { - "comment" : "A picker row that lets the user select a snooze interval. The argument is the number of minutes in the interval.", - "isCommentAutoGenerated" : true - }, - "%lld." : { - "comment" : "A number followed by a period, used to number a list of references.", - "isCommentAutoGenerated" : true - }, - "%lld%%" : { - - }, - "%lldd" : { - - }, - "%lldx" : { - "comment" : "A label that shows the playback speed of the audio. The argument is the playback speed.", - "isCommentAutoGenerated" : true - }, - "•" : { - - }, - "<%@" : { - - }, - ">%@" : { - - }, - "⚠️" : { - "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "⚠️" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "⚠️" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "⚠️" + "value" : "Azi până acum %1$@, de obicei %2$@ până la %3$@." } }, - "it" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "⚠️" + "value" : "Сегодня на данный момент %1$@, обычно %2$@ к %3$@." } }, - "nb" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "⚠️" + "value" : "Dnes zatiaľ %1$@, zvyčajne %2$@ do %3$@." } }, - "nl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "⚠️" + "value" : "Hittills i dag %1$@, vanligtvis %2$@ vid %3$@." } }, - "pl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "⚠️" + "value" : "Bugün şu ana kadar %1$@, genelde %3$@ itibarıyla %2$@." } }, - "ro" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "⚠️" + "value" : "Сьогодні наразі %1$@, зазвичай %2$@ до %3$@." } }, - "ru" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "⚠️" + "value" : "Hôm nay đến giờ %1$@, thường %2$@ trước %3$@." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "⚠️" + "value" : "今日至今 %1$@,通常到 %3$@ 为 %2$@。" } } } }, - "0" : { - - }, - "0.5" : { - "comment" : "A label displayed in the playback speed menu.", - "isCommentAutoGenerated" : true - }, - "0.5x" : { - "comment" : "A label for a playback speed of 0.5x.", - "isCommentAutoGenerated" : true - }, - "1" : { - "comment" : "A label for a playback speed of 1.", - "isCommentAutoGenerated" : true - }, - "1x" : { - "comment" : "A label for the playback speed of 1.", - "isCommentAutoGenerated" : true - }, - "2" : { - "comment" : "A label for a playback speed of 2x.", - "isCommentAutoGenerated" : true - }, - "2x" : { - "comment" : "A label for a playback speed of 2x.", - "isCommentAutoGenerated" : true - }, - "3-6" : { - - }, - "6-9" : { - - }, - "9-20" : { - - }, - "10" : { - - }, - "15 min glucose regression coefficient (b₁), continued with decay over 30 min" : { - "comment" : "Description of the prediction input effect for glucose momentum", + "Total" : { + "comment" : "Basal and bolus total row: basal plus bolus", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "15 دقيقة معامل انحدار قراءات سكر الدم (b₁), ويستمر بالاضمحلال خلال 30 دقيقة" + "value" : "الإجمالي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Celkem" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "15 min. glukoseregressionskoefficient (b₁), fortsætter med henfald over 30 minutter." + "value" : "I alt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "15 Minuten Blutzucker-Regressionskoeffizient (b₁), fortgesetzt mit Abfall über 30 min" + "value" : "Gesamt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Coeficiente de regresión de glucosa de 15 minutos (b₁), continuado con decaimiento durante 30 minutos" + "value" : "Total" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "15 min glukoosin regressiokerroin (b₁), hiipuen 30 min kuluessa" + "value" : "Yhteensä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Coefficient de régression du glucose de 15 minutes (b1), décroissance poursuivie au-delà de 30 min." + "value" : "Total" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "15 min glucose regression coefficient (b₁), continued with decay over 30 min" + "value" : "סה״כ" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Összesen" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Coefficiente di regressione della glicemia a 15 minuti (b₁), continuato con decadimento per 30 minuti" + "value" : "Totale" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "15分 グルコース回帰係数 (b₁)、30分退化適用" + "value" : "合計" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "15 minutters glukose-regresjonskoeffisient (b1), fortsatt med nedbrytning over 30 minutter." + "value" : "Totalt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "15 min glucose regressiecoëficiënt (b₁), gevolgd door afbouw over 30 min" + "value" : "Totaal" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "15-minutowy współczynnik regresji glukozy (b₁), kontynuowany z rozkładem przez 30 min." + "value" : "Razem" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "15 min coeficiente de regressão de glicose (b₁), continuada com queda em 30 min." + "value" : "Total" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "coeficient de regresie glicemică pe 15 min (b₁), continuat cu o diminuare pe 30 min." + "value" : "Total" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "15-мин коэффициент регрессии гликемии (b1), продолжен с угасанием 30 мин" + "value" : "Всего" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "15 minútový regresný koeficient glykémie (b1), pokračujúci s poklesom počas 30 minút" + "value" : "Spolu" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "15 minuters glukosregressionskoefficient (b₁), fortsatt med 30 minuters avklingande" + "value" : "Totalt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "15 dakikalık glikoz regresyon katsayısı (b₁), 30 dakika boyunca bozuk devam etti" + "value" : "Toplam" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Усього" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "15 phút hồi quy glucose (b₁), tiếp tục phân rã trên 30 phút." + "value" : "Tổng" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "15分钟血糖回归系数 (b₁),持续30分钟衰减" + "value" : "总计" } } } }, - "25-33%" : { - - }, - "30 min comparison of glucose prediction vs actual, continued with decay over 60 min" : { - "comment" : "Description of the prediction input effect for retrospective correction", + "Total %1$@" : { + "comment" : "VoiceOver: total insulin. (1: units)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "30 دقيقة مقارنة قراءات سكر الدم المتوقعة والفعلية , ويستمر بالاضمحلال خلال 60 دقيقة" + "value" : "الإجمالي %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Celkem %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "30 min. sammenligning af glukose-forudsigelse kontra faktisk målt glukose, med henfald over 60 minutter." + "value" : "I alt %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "30-minütiger Vergleich der Blutzuckerprognose gegenüber dem tatsächlichen Blutzucker, Fortsetzung mit Abfall über 60 min" + "value" : "Gesamt %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Comparación de glucosa actual contra la proyectada en 30 minutos, continuada con decaimiento durante 60 minutos." + "value" : "Total %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "30 min vertailu ennustetun ja todellisen glukoosin välillä, hiipuen 60 min kuluessa" + "value" : "Yhteensä %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Comparaison sur 30 min de la glycémie prévue par rapport à celle réelle, suivie d'une décroissance (decay) sur 60 min." + "value" : "Total %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "30 min comparison of glucose prediction vs actual, continued with decay over 60 min" + "value" : "סה״כ %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Összesen %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Confronto di 30 minuti tra la previsione della glicemia e quella effettiva, continuato con decadimento per 60 minuti" + "value" : "Totale %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "30分 グルコース予想値と実際値の比較、60分退化適用" + "value" : "合計 %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "30 min sammenligning av glukose-prediksjon vs faktisk, fortsatt med nedbrytning over 60 min." + "value" : "Totalt %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "30 min vergelijking van glucosevoorspelling versus de werkelijke, gevolgd door afbouw over 60 min" + "value" : "Totaal %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "30 minutowe porównanie przewidywania stężenia glukozy w stosunku do rzeczywistego, kontynuowane z rozkładem przez 60 min." + "value" : "Razem %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "30 min de comparação da previsão de glicose vs atual, continuada com queda em 60 min." + "value" : "Total %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Comparație timp de 30 de minute între predicția glicemiei și valoarea reală, continuată cu scăderea valorii pe parcursul a 60 de minute" + "value" : "Total %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "30 мин сравнение предсказанной гликемии с действительной, продолжено с угасанием 60 мин" + "value" : "Всего %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spolu %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "30 min jämförelse av glukosprediktion och faktiskt värde, fortsatt med 60 miuters avklingande." + "value" : "Totalt %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "30 dakikalık glikoz tahmini ile gerçek karşılaştırması, 60 dakika boyunca bozuk devam etti" + "value" : "Toplam %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Усього %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "30 phút so sánh dự đoán glucose so với thực tế, tiếp tục với sự phân rã hơn 60 phút." + "value" : "Tổng %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "30分钟葡萄糖预测与实际比较,持续60分钟以上衰减" + "value" : "总计 %1$@" } } } }, - "100m sprint" : { - - }, - "A critical issue has been discovered in this version of %1$@. To continue using the app, you must update to the latest version." : { - "comment" : "Required update modal paragraph 1 (1: app name)" - }, - "A critical update is available. Your app may not function correctly until you update to the latest version." : { - "comment" : "Software update description for required update" - }, - "A few seconds remaining" : { - "comment" : "Estimated remaining duration with a few seconds", + "Total so far" : { + "comment" : "Basal and bolus total row for today, which isn't over yet", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الإجمالي حتى الآن" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Celkem zatím" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Et par sekunder tilbage" + "value" : "I alt indtil nu" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ein paar Sekunden verbleiben" + "value" : "Gesamt bisher" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Quedan unos segundos" + "value" : "Total hasta ahora" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Muutama sekunti jäljellä" + "value" : "Yhteensä tähän mennessä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Quelques secondes restantes" + "value" : "Total jusqu'ici" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "נותרו כמה שניות" + "value" : "סה״כ עד כה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Összesen eddig" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Pochi secondi rimanenti" + "value" : "Totale finora" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "これまでの合計" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Noen sekunder gjenstår" + "value" : "Totalt så langt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Nog een paar seconden" + "value" : "Totaal tot nu toe" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pozostało kilka sekund" + "value" : "Razem do tej pory" } }, - "ro" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Câteva secunde rămase" + "value" : "Total até agora" } }, - "ru" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Осталось несколько секунд" + "value" : "Total până acum" } }, - "sv" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Några sekunder återstår" + "value" : "Всего на данный момент" } }, - "tr" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Birkaç saniye kaldı" + "value" : "Spolu zatiaľ" } }, - "zh-Hans" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "剩余几秒" + "value" : "Totalt hittills" } - } - } - }, - "A manual glucose entry must be between %@ and %@" : { - "comment" : "Alert message for a manual glucose entry out of range error", - "localizations" : { - "da" : { + }, + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "En manuel blodsukkerindtastning skal være mellem %1$@ og %2$@" + "value" : "Şu ana kadar toplam" } }, - "de" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Der manuelle Blutzucker muss zwischen %1$@ und %2$@ liegen" + "value" : "Усього наразі" } }, - "es" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Una entrada de glucosa manual debe estar entre %1$@ y %2$@" + "value" : "Tổng đến giờ" } }, - "fi" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Syötetyn glukoosiarvon on oltava välillä %1$@ – %2$@" + "value" : "至今总计" } - }, - "fr" : { + } + } + }, + "Total so far %1$@" : { + "comment" : "VoiceOver: today's total insulin so far. (1: units)", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Une saisie manuelle de la glycémie doit être comprise entre %1$@ et %2$@." + "value" : "الإجمالي حتى الآن %1$@" } }, - "it" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Un inserimento manuale della glicemia deve essere compreso tra %1$@ e %2$@" + "value" : "Celkem zatím %1$@" } }, - "nb" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "En manuell BS-registrering må være mellom %1$@ og %2$@" + "value" : "I alt indtil nu %1$@" } }, - "nl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Een handmatige glucose-invoer moet tussen %1$@ en %2$@ liggen" + "value" : "Gesamt bisher %1$@" } }, - "pl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ręczny wpis poziomu glukozy musi mieścić się w przedziale od %1$@ do %2$@" + "value" : "Total hasta ahora %1$@" } }, - "ro" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "O intrare manuală de glicemie trebuie să fie între %1$@ și %2$@" + "value" : "Yhteensä tähän mennessä %1$@" } }, - "ru" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ручной ввод глюкозы должен находиться между %1$@ и %2$@" + "value" : "Total jusqu'ici %1$@" } }, - "sv" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Det manuellt inmatade blodsockervärdet måste vara mellan %1$@ och %2$@" + "value" : "סה״כ עד כה %1$@" } }, - "tr" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Manuel KŞ girişi %1$@ ile %2$@ arasında olmalıdır" + "value" : "Összesen eddig %1$@" } }, - "zh-Hans" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "请输入 %@ 到 %@ 之间的血糖值" + "value" : "Totale finora %1$@" } - } - } - }, - "A manual glucose entry must be between %1$@ and %2$@." : { - "comment" : "Warning for simple bolus when glucose entry is out of range. (1: upper bound) (2: lower bound)", - "localizations" : { - "da" : { + }, + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "En manuel glukoseindtastning skal være mellem %1$@ og %2$@" + "value" : "これまでの合計 %1$@" } }, - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Der manuelle Blutzucker muss zwischen %1$@ und %2$@ liegen." + "value" : "Totalt så langt %1$@" } }, - "es" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Una entrada de glucosa manual debe estar entre %1$@ y %2$@ ." + "value" : "Totaal tot nu toe %1$@" } }, - "fr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Une saisie manuelle de la glycémie doit être comprise entre %1$@ et %2$@." + "value" : "Razem do tej pory %1$@" } }, - "he" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "הזנת גלוקוז ידנית חייבת להיות בין %1$@ ל- %2$@." + "value" : "Total até agora %1$@" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Un inserimento manuale della glicemia deve essere compreso tra %1$@ e %2$@." + "value" : "Total până acum %1$@" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "En manuell BS-registrering må være mellom %1$@ og %2$@ ." + "value" : "Всего на данный момент %1$@" } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Een handmatige glucose-invoer moet tussen %1$@ en %2$@ liggen." + "value" : "Spolu zatiaľ %1$@" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ręczny wpis poziomu glukozy musi mieścić się w przedziale od %1$@ do %2$@ ." + "value" : "Totalt hittills %1$@" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "O intrare manuală de glicemie trebuie să fie între %1$@ și %2$@ ." + "value" : "Şu ana kadar toplam %1$@" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Ручной ввод глюкозы должен находиться между %1$@ и %2$@" + "value" : "Усього наразі %1$@" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Manuel KŞ girişi %1$@ ile %2$@ arasında olmalıdır." + "value" : "Tổng đến giờ %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "请输入 %1$@ 到 %2$@ 之间的血糖值" + "value" : "至今总计 %1$@" } } } }, - "A model based on the published absorption of Fiasp insulin." : { - "comment" : "Subtitle of Fiasp preset", - "extractionState" : "manual", + "Usually %1$@ by %2$@" : { + "comment" : "Trends: the median insulin delivered by this time of day over the last 14 days. (1: units, e.g. 28.4 U, 2: time of day)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "نموذج يستند على امتصاص أنسولين Fiasp." + "value" : "عادةً %1$@ بحلول %2$@" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "En model baseret på publiceret data om absorption af Fiasp insulin." + "value" : "Obvykle %1$@ do %2$@" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ein Modell basierend auf der veröffentlichten Resorption von Fiasp-Insulin." + "value" : "Normalt %1$@ kl. %2$@" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "A model based on the published absorption of Fiasp insulin." + "value" : "Üblicherweise %1$@ bis %2$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Un modelo basado en la publicación de la absorción de insulina Fiasp." + "value" : "Normalmente %1$@ a las %2$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Perustuu Fiasp-insuliinin julkaistuun imeytymismalliin." + "value" : "Yleensä %1$@ klo %2$@ mennessä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Un modèle basé sur l’absorption de l’insuline FIASP (telle que publiée)." + "value" : "D'habitude %1$@ à %2$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "A model based on the published absorption of Fiasp insulin." + "value" : "בדרך כלל %1$@ עד %2$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Általában %1$@ ilyenkorra (%2$@)" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Un modello basato sull'assorbimento pubblicato dell'insulina Fiasp." + "value" : "Di solito %1$@ entro le %2$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Fiaspインスリンの公表吸収率に基づいたモデル。" + "value" : "通常は%2$@までに%1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "En modell basert på publisert absorpsjon av Fiasp-insulin." + "value" : "Vanligvis %1$@ innen %2$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Een model gebaseerd op de gepubliceerde opname van Fiasp insuline." + "value" : "Meestal %1$@ om %2$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Model oparty na opublikowanej absorpcji insulin Fiasp." + "value" : "Zwykle %1$@ do %2$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Um modelo baseado na absorção publicada da insulina Fiasp." + "value" : "Normalmente %1$@ até %2$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Un model bazat pe absorbția declarată a insulinei Fiasp." + "value" : "De obicei %1$@ până la %2$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Модель, основанная на опубликованных данных усвоения FIASP инсулина." + "value" : "Обычно %1$@ к %2$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Model založený na publikovanej absorpcii inzulínu Fiasp." + "value" : "Zvyčajne %1$@ do %2$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinmodell baserad på publicerade studier av absorption av Fiasp-insulin." + "value" : "Vanligtvis %1$@ vid %2$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp insülininin yayınlanmış emilimine dayanan bir model." + "value" : "Genelde %2$@ itibarıyla %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Зазвичай %1$@ до %2$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Mô hình dựa trên sự hấp thụ được công bố đối với insulin Fiasp." + "value" : "Thường %1$@ trước %2$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "基于公布的Fiasp胰岛素吸收的模型" + "value" : "通常到 %2$@ 为 %1$@" } } } }, - "A model based on the published absorption of Humalog, Novolog, and Apidra insulin in adults." : { - "comment" : "Subtitle of Rapid-Acting – Adult preset", + " - " : { + + }, + " (pending: %@)" : { + "comment" : "The string format appended to active insulin that describes pending insulin. (1: pending insulin)", "extractionState" : "manual", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "نموذج يستند على امتصاص أنسولين Humalog و Novolog و Apidra لدى البالغين." + "value" : " (قيد الانتظار: %@)" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "En model baseret på publiceret data om absorption Humalog, Novolog, og Apidra insulin hos voksne." + "value" : " (afventer: %@)" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ein Modell auf der Grundlage der veröffentlichten Resorption von Humalog, Novolog und Apidra Insulin bei Erwachsenen." + "value" : " (stehen aus: %@)" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "A model based on the published absorption of Humalog, Novolog, and Apidra insulin in adults." + "value" : " (pending: %@)" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Un modelo basado en la publicación de la absorción de insulina Humalog, Novolog y Apidra en adultos." + "value" : " (pendiente: %@)" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Perustuu Humalog-, Novorapid- ja Apidra-insuliinien julkaistuun imeytymismalliin aikuisilla." + "value" : "(odot.: %@)" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Un modèle basé sur les absorptions de l’Humalog, Novolog (Novorapid), et Apidra chez l’adulte (telles que publiées)." + "value" : " (en attente : %@)" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "A model based on the published absorption of Humalog, Novolog, and Apidra insulin in adults." + "value" : " (pending: %@)" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Un modello basato sull'assorbimento pubblicato dell'insulina Humalog, Novolog e Apidra negli adulti." + "value" : " (in attesa: %@)" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "大人使用時の Humalog、Novolog、Apidraインスリンの公表吸収率に基づいたモデル。" + "value" : " (保留中: %@)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "En modell basert på publisert absorpsjon av Humalog, Novolog og Apidra insulin hos voksne." + "value" : "(venter: %@ )" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Een model gebaseerd op de gepubliceerde absorptie van Humalog-, Novolog- en Apidra-insuline bij volwassenen." + "value" : " (Wachten: %@)" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Model oparty na opublikowanej absorpcji insulin Humalog, Novolog/Novorapid i Apidra u dorosłych." + "value" : " (oczekujące: %@)" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Um modelo baseado na absorção publicada das insulinas Humalog, Novolog e Apidra em adultos." + "value" : " (pendente: %@)" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Un model bazat pe absorbția declarată a insulinei Humalog, Novolog și Apidra la adulți." + "value" : " (în așteptare: %@)" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Модель, основанная на опубликованных данных усвоения Humalog, Novolog и Apidra у взрослых." - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Model založený na publikovanej absorpcii inzulínu Humalog, Novolog a Apidra u dospelých." + "value" : " (В ожидании: %@)" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinmodell baserad på publicerade studier av absorption av Humalog-, Novolog- samt Apidra-insulin hos vuxna." + "value" : " (återstår: %@)" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Yetişkinlerde yayınlanmış Humalog, Novolog ve Apidra insülin emilimine dayalı bir model." + "value" : " (bekliyor: %@)" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Mô hình dựa trên sự hấp thụ được công bố của các loại insulin Humalog, Novolog và Apidra ở người lớn." + "value" : " (đang chờ xử lý: %@)" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "基于已发表的成人使用优泌乐、诺和锐和爱倍达胰岛素吸收数据的模型。" + "value" : " (待执行: %@)" } } } }, - "A new version of %@ is available and is recommended to continue using the app." : { - "comment" : "Software update available section footer (1: app name)", + " **Tip** Use your %@ **Jogging** preset" : { + + }, + " **Tip** Use your %@ **Walking** preset" : { + + }, + " %" : { + + }, + " %@" : { + + }, + " %@" : { + + }, + " %@ · " : { + + }, + " %@ read" : { + + }, + " %lld hours ago" : { + + }, + " grams" : { + + }, + " of " : { + + }, + " Pre-meal Preset" : { + "comment" : "Status row title for premeal override enabled (leading space is to separate from symbol)", + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "En ny version af %@ er tilgængelig og anbefales for at fortsætte med at bruge appen." + "value" : "Før-måltid forudindstillinger" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Eine neue Version von %@ ist verfügbar und es wird empfohlen, die App weiterhin zu verwenden." + "value" : " Voreinstellung zum Essen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Hay una nueva versión de %@ disponible y se recomienda continuar usando la aplicación." + "value" : " Pre-Comida Preestablecida" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : " Ennen ateriaa -esiasetus" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Une nouvelle version de %@ est disponible et est recommandée pour continuer à utiliser l'application." + "value" : " Préréglage Pré-repas" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קדם-ארוחה" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "È disponibile una nuova versione di %@ e si consiglia di continuare a utilizzare l'app." + "value" : " Preset pre-pasto" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "En ny versjon av %@ er tilgjengelig og anbefales for å fortsette å bruke appen." + "value" : "Forhåndsinnstilling før måltid" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Er is een nieuwe versie van %@ beschikbaar die aanbevolen wordt om de app te kunnen blijven gebruiken." + "value" : " Pre-Meal programma" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dostępna jest nowa wersja %@, która jest zalecana do dalszego korzystania z aplikacji." + "value" : " Przed Posiłkiem" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "O nouă versiune de %@ este disponibilă și se recomandă să continuați să utilizați aplicația." + "value" : " Presetare înainte de masă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Новая версия %@ доступна и рекомендуется для продолжения использования приложения." + "value" : "Режим до еды" } }, - "tr" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 'ın yeni bir sürümü mevcut ve uygulamayı kullanmaya devam etmeniz önerilir." + "value" : " Preprandiellt förval" } }, - "zh-Hans" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 已推出新版本,建议您继续使用该应用。" + "value" : "Yemek-Öncesi Ön Ayarı" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : " 餐前预设" } } } }, - "A new version of %@ is available." : { - "comment" : "Required software update section footer (1: app name)", + " remaining" : { + "comment" : "remaining time in setting's profile expiration section", "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "zbývající" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "En ny version af %@ er tilgængelig." + "value" : " tilbage" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Eine neue Version von %@ ist verfügbar." + "value" : " verbleiben" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Hay una nueva versión de %@ disponible." + "value" : "restantes" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Une nouvelle version de %@ est disponible." + "value" : " restant(s)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : " נותר" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "remaining" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "È disponibile una nuova versione di %@." + "value" : " rimanenti" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "En ny versjon av %@ er tilgjengelig." + "value" : "gjenstående" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Er is een nieuwe versie van %@ beschikbaar." + "value" : " resterend" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dostępna jest nowa wersja %@ ." + "value" : " pozostały" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Este disponibilă o nouă versiune de %@ ." + "value" : " rămas" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Доступна новая версия %@ ." + "value" : " осталось" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Yeni bir %@ sürümü mevcuttur." + "value" : "kalan" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "remaining" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%@有新版本可用。" + "value" : " 剩余" } } } }, - "A percentage **above 100%** tells the system you need **more** insulin" : { - - }, - "A percentage **below 100%** tells the system you need **less** insulin" : { - - }, - "A preset with %@ overall insulin is on. The system is currently delivering less than your preset baseline." : { - - }, - "A preset with %@ overall insulin is on. The system is currently delivering more than your preset baseline." : { - - }, - "A preset with %@ overall insulin is on. This is your new preset baseline and it overrides your Scheduled Basal." : { - - }, - "A pump must be configured before a bolus can be delivered." : { - "comment" : "Alert message for a missing pump error", + " Safety Notifications are OFF" : { + "comment" : "Warning text for when Notifications or Critical Alerts Permissions is disabled", + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "En pumpe skal være konfigureret, før en bolus kan leveres." + "value" : " Sikkerhedsmeddelelser er SLÅET FRA" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Eine Pumpe muss konfiguriert werden, bevor ein Bolus abgegeben werden kann." + "value" : "Sicherheitsbenachrichtigungen sind ausgeschaltet" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Una microinfusadora debe ser configurada antes de que un bolo pueda ser entregado." + "value" : " Notificaciones de seguridad desactivadas" } }, - "fi" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Pumppu on määritettävä, ennen kuin bolus voidaan annostella." + "value" : "Notifications de sécurité sont DÉSACTIVÉES" } }, - "fr" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Une pompe doit être configurée avant qu'un bolus puisse être administré." + "value" : " התראות בטיחות כבויות" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Prima di poter erogare un bolo, è necessario configurare una pompa." + "value" : " Le notifiche di sicurezza sono disattivate" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "En pumpe må konfigureres før en bolus kan tilføres." + "value" : "Sikkerhetsvarsler er AV" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Een pomp moet worden geconfigureerd voordat een bolus kan worden toegediend." + "value" : " Veiligheids- en kritieke meldingen staan UIT" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przed podaniem bolusa należy skonfigurować pompę." + "value" : "Powiadomienia dotyczące bezpieczeństwa są WYŁĄCZONE" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "O pompă trebuie configurată înainte ca un bolus să poată fi administrat." + "value" : " Notificările de siguranță sunt dezactivate" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Перед введением болюса необходимо настроить помпу." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "En pump måste ha lagts till och konfigurerats innan en bolus ge ges." + "value" : " Оповещения о безопасности выключены" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus iletilmeden önce bir pompanın yapılandırılması gerek." + "value" : "Güvenlik Bildirimleri KAPALI" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在注射大剂量前,必须先配置胰岛素泵。" + "value" : " 安全提醒已关闭" } } } }, - "Above range (>180): %d%% · goal <25%%" : { - "comment" : "TIR above-range summary" + " setting. Adjusting it can help reduce the risk of low glucose if you expect unusual fluctuations." : { + }, - "Absorption Time" : { - "comment" : "Label for food absorption entry on add favorite food screen", + " Workout Preset" : { + "comment" : "Status row title for workout override enabled (leading space is to separate from symbol)", + "extractionState" : "stale", "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Motion forudindstilling" + } + }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Resorptionsdauer" + "value" : " Zielbereichsänderung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : " Ejercicio Preestablecido" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : " Liikuntatila" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Temps d'absorption" + "value" : " Préréglage exercice" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "זמן ספיגה" + "value" : "פעילות גופנית" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : " Preset allenamento" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Absorpsjonstid" + "value" : "Forhåndsinnstilling for trening" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Opnametijd" + "value" : " Trainingsprogramma" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : " Wstępne ustawienia treningu" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Timp de absorbție" + "value" : " Presetare antrenament" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пресет физнагрузки" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : " Träningsförval" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egzersiz Ön Ayarı" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "吸收时间" + "value" : " 运动预设" } } } }, - "AcceptRecommendedBolus" : { - "comment" : "Action to copy the recommended Bolus value to the actual Bolus Field", - "extractionState" : "manual", + "%1$@ d" : { + "comment" : "Trends period picker, short label for a period of several days, e.g. 7 d. (1: number of days)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "استخدم قيمة الجرعة الموصى بها" + "value" : "%1$@ يوم" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "AccepterAnbefaletBolus" + "value" : "%1$@ d" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Akzeptiere empfohlenen Bolus" + "value" : "%1$@ d" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "AcceptRecommendedBolus" + "value" : "%1$@ T" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "AceptarBoloRecomendado" + "value" : "%1$@ d" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "HyväksySuositeltuBolus" + "value" : "%1$@ pv" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "AcceptRecommendedBolus" + "value" : "%1$@ j" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "AcceptRecommendedBolus" + "value" : "%1$@ ימ׳" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ nap" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "AcceptRecommendedBolus" + "value" : "%1$@ g" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "推奨ボーラス値を使う" + "value" : "%1$@日" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "AksepterAnbefaltBolus" + "value" : "%1$@ d" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "AccepteerVoorgesteldeBolus" + "value" : "%1$@ d" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "AcceptRecommendedBolus" + "value" : "%1$@ d" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "AceitarBolusRecomendado" + "value" : "%1$@ d" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "AcceptațiBolusRecomandat" + "value" : "%1$@ z" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Принятьрекомендуемыйболюс" + "value" : "%1$@ д" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Akceptovať Odporúčaný Bolus" + "value" : "%1$@ d" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "AcceptRecommendedBolus" + "value" : "%1$@ d" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "ÖnerilenBolusuKabulEt" + "value" : "%1$@ g" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ д" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "AcceptRecommendedBolus" + "value" : "%1$@ ngày" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "接受推荐的大剂量输注" + "value" : "%1$@天" } } } }, - "Active Carbohydrates" : { - "comment" : "The title of the Carbs On-Board graph", + "%1$@ entries" : { + "comment" : "Trends Carbs per day tile detail: average number of carb entries per day, a fractional value such as 2.5, so not pluralised. (1: number with one decimal)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "الكربوهيدرات النشطة" + "value" : "%1$@ إدخالات" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "záznamů: %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Aktive kulhydrater" + "value" : "%1$@ registreringer" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Aktive Kohlenhydrate" + "value" : "%1$@ Einträge" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidratos Activos" + "value" : "%1$@ entradas" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiivinen hiilihydraatti" + "value" : "%1$@ kirjausta" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glucides actifs" + "value" : "%1$@ entrées" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "פחמימות פעילות" + "value" : "%1$@ רשומות" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ bejegyzés" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidrati attivi" + "value" : "%1$@ inserimenti" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "残存糖質" + "value" : "%1$@件" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Aktive karbohydrater" + "value" : "%1$@ registreringer" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Actieve koolhydraten" + "value" : "%1$@ registraties" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Aktywne węglowodany" + "value" : "wpisów: %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidratos Ativos" + "value" : "%1$@ registros" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidrați activi" + "value" : "%1$@ intrări" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Действующие углеводы" + "value" : "записей: %1$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Aktívne sacharidy" + "value" : "záznamov: %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiva kolhydrater" + "value" : "%1$@ registreringar" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Aktif Karbonhidrat" + "value" : "%1$@ giriş" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "записів: %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lượng Carbohydrates còn hoạt động" + "value" : "%1$@ lần nhập" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "活性碳水" + "value" : "%1$@条" } } } }, - "Active Carbohydrates: %@" : { - "comment" : "The string format describing active carbohydrates. (1: localized glucose value description)", - "extractionState" : "manual", + "%1$@ for %2$@" : { + "comment" : "A temp basal: its rate and how long it ran. (1: rate, e.g. 0.50 U/h; 2: duration, e.g. 30m)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "الكربوهيدرات النشطة: %@" + "value" : "%1$@ لمدة %2$@" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Aktive kulhydrater: %@" + "value" : "%1$@ po dobu %2$@" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Aktive Kohlenhydrate: %@" + "value" : "%1$@ i %2$@" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Active Carbohydrates: %@" + "value" : "%1$@ für %2$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidratos Activos: %@" + "value" : "%1$@ durante %2$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiivinen hiilihydraatti: %@" + "value" : "%1$@ %2$@ ajan" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glucides actifs: %@" + "value" : "%1$@ pendant %2$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "פחמימות פעילות: %@" + "value" : "%1$@ למשך %2$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ ideig" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidrati attivi: %@" + "value" : "%1$@ per %2$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "残存糖質: %@" + "value" : "%1$@(%2$@間)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Aktive karbohydrater: %@" + "value" : "%1$@ i %2$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Actieve koolhydraten: %@" + "value" : "%1$@ gedurende %2$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Aktywne węglowodany: %@" + "value" : "%1$@ przez %2$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidratos Ativos: %@" + "value" : "%1$@ por %2$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidrați activi: %@" + "value" : "%1$@ timp de %2$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Действующие углеводы: %@" + "value" : "%1$@ на %2$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Aktívne sacharidy: %@" + "value" : "%1$@ počas %2$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiva kolhydrater: %@" + "value" : "%1$@ i %2$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Aktif Karbonhidrat: %@" + "value" : "%2$@ boyunca %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ на %2$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lượng Carbohydrates còn hoạt động: %@" + "value" : "%1$@ trong %2$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "活性碳水化合物: %@" + "value" : "%1$@,持续%2$@" } } } }, - "Active Carbs" : { - "comment" : "Title describing quantity of still-absorbing carbohydrates", + "%1$@ for %2$@ (scheduled %3$@)" : { + "comment" : "A temp basal: its rate, how long it ran and the scheduled rate it replaced. (1: rate, e.g. 0.50 U/h; 2: duration, e.g. 30m; 3: scheduled rate number, e.g. 0.80)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "كارب النشط" + "value" : "%1$@ لمدة %2$@ (المجدول %3$@)" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ po dobu %2$@ (dle plánu %3$@)" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Aktive kulhydrater" + "value" : "%1$@ i %2$@ (planlagt %3$@)" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Aktive KH" + "value" : "%1$@ für %2$@ (geplant %3$@)" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidratos Activos" + "value" : "%1$@ durante %2$@ (programada %3$@)" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Akt. hiilari" + "value" : "%1$@ %2$@ ajan (ohjelmoitu %3$@)" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glucides actifs" + "value" : "%1$@ pendant %2$@ (programmé %3$@)" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "פחמימות פעילות" + "value" : "%1$@ למשך %2$@ (מתוזמן %3$@)" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ ideig (ütemezett: %3$@)" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidrati attivi" + "value" : "%1$@ per %2$@ (programmata %3$@)" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "残存糖質" + "value" : "%1$@(%2$@間、予定 %3$@)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Aktive karbohydrater" + "value" : "%1$@ i %2$@ (planlagt %3$@)" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Actieve koolhydraten" + "value" : "%1$@ gedurende %2$@ (gepland %3$@)" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Aktywne węglowodany" + "value" : "%1$@ przez %2$@ (wg planu %3$@)" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidratos Ativos" + "value" : "%1$@ por %2$@ (programada %3$@)" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidrați activi" + "value" : "%1$@ timp de %2$@ (programat %3$@)" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Активные углеводы" + "value" : "%1$@ на %2$@ (по плану %3$@)" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Aktívne sacharidy" + "value" : "%1$@ počas %2$@ (podľa plánu %3$@)" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiva kolhydrater" + "value" : "%1$@ i %2$@ (schemalagd %3$@)" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Aktif Karb." + "value" : "%2$@ boyunca %1$@ (planlanan %3$@)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ на %2$@ (за планом %3$@)" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lượng Carbs còn hoạt động" + "value" : "%1$@ trong %2$@ (theo lịch %3$@)" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "活性碳水" + "value" : "%1$@,持续%2$@(预设 %3$@)" } } } }, - "Active Insulin" : { - "comment" : "Details for missing data error when active insulin amount is missing\nThe title of the Insulin On-Board graph\nTitle describing quantity of still-absorbing insulin", + "%1$@ g" : { + "comment" : "Format string for an amount of carbohydrate in grams. (1: grams)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "أنسولين نشط" + "value" : "%1$@ g" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivt insulin" + "value" : "%1$@ g" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Aktives Insulin" + "value" : "%1$@ g" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina activa" + "value" : "%1$@ g" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Akt. insuliini" + "value" : "%1$@ g" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Insuline active" + "value" : "%1$@ g" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "אינסולין פעיל" + "value" : "%1$@ g" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ g" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina attiva" + "value" : "%1$@ g" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "残存インスリン" + "value" : "%1$@ g" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivt insulin" + "value" : "%1$@ g" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Actieve insuline" + "value" : "%1$@ g" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Aktywna insulina" + "value" : "%1$@ g" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina Ativa" + "value" : "%1$@ g" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Insulină activă" + "value" : "%1$@ g" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Активный инсулин" + "value" : "%1$@ г" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Aktívny inzulín" + "value" : "%1$@ g" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivt insulin" + "value" : "%1$@ g" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Aktif İnsülin" + "value" : "%1$@ gr" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ г" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lượng Insulin còn hoạt động" + "value" : "%1$@ g" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "活性胰岛素" + "value" : "%1$@ 克" } } } }, - "Active Insulin: %@" : { - "comment" : "The string format describing active insulin. (1: localized insulin value description)", - "extractionState" : "manual", + "%1$@ h" : { + "comment" : "Time in range row: average hours a day spent in the band, abbreviated. (1: hours with one decimal)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "الأنسولين النشط: %@" + "value" : "%1$@ س" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiv insulin: %@" + "value" : "%1$@ h" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Aktives Insulin: %@" + "value" : "%1$@ t" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Active Insulin: %@" + "value" : "%1$@ Std" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina Activa: %@" + "value" : "%1$@ h" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiivinen insuliini: %@" + "value" : "%1$@ h" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Insuline active: %@" + "value" : "%1$@ h" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "אינסולין פעיל: %@" + "value" : "%1$@ שע׳" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ óra" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina attiva: %@" + "value" : "%1$@ h" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "残存インスリン: %@" + "value" : "%1$@時間" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivt insulin: %@" + "value" : "%1$@ t" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Actieve insuline: %@" + "value" : "%1$@ u" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Aktywna Insulina: %@" + "value" : "%1$@ godz." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina Ativa: %@" + "value" : "%1$@ h" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Insulină activă: %@" + "value" : "%1$@ h" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Действующий инсулин: %@" + "value" : "%1$@ ч" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Aktívny inzulín: %@" + "value" : "%1$@ h" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivt insulin: %@" + "value" : "%1$@ h" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Aktif İnsülin: %@" + "value" : "%1$@ sa" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ год" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lượng Insulin còn hoạt động: %@" + "value" : "%1$@ giờ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "活性胰岛素: %@" + "value" : "%1$@ 小时" } } } }, - "Add a new favorite food" : { - "comment" : "Button label to open new favorite food view", + "%1$@ mmol/mol" : { + "comment" : "Trends GMI tile detail: the GMI in IFCC units. (1: value)", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Tilføj en ny favoritmad" + "value" : "%1$@ mmol/mol" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Füge ein neues Lieblingsessen hinzu" + "value" : "%1$@ mmol/mol" } }, - "fr" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter un nouveau plat préféré" + "value" : "%1$@ mmol/mol" } }, - "he" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "הוסף מאכל אהוב חדש" + "value" : "%1$@ mmol/mol" } }, - "it" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Aggiungi un nuovo cibo preferito" + "value" : "%1$@ mmol/mol" } }, - "nb" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Legg til en ny favorittmat" + "value" : "%1$@ mmol/mol" } }, - "nl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Voeg een nieuw favoriet eten toe" + "value" : "%1$@ mmol/mol" } }, - "pl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Dodaj nowe ulubione jedzenie" + "value" : "%1$@ mmol/mol" } }, - "ro" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați o nouă mâncare preferată" + "value" : "%1$@ mmol/mol" } }, - "zh-Hans" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "添加常用食物" + "value" : "%1$@ mmol/mol" } - } - } - }, - "Add Alert Profile" : { - "comment" : "The text of a button that allows a user to add a new alert profile.", - "isCommentAutoGenerated" : true - }, - "Add Carb Entry" : { - "comment" : "Title of the user activity for adding carbs", - "localizations" : { - "ar" : { + }, + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Add Carb Entry" + "value" : "%1$@ mmol/mol" } }, - "da" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Tilføj kulhydrater" + "value" : "%1$@ mmol/mol" } }, - "de" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "KH hinzufügen" + "value" : "%1$@ mmol/mol" } }, - "es" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Agregar Entrada de Carb" + "value" : "%1$@ mmol/mol" } }, - "fi" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Lisää hiilihydraatteja" + "value" : "%1$@ mmol/mol" } }, - "fr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter des glucides" + "value" : "%1$@ mmol/mol" } }, - "he" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "הוספת פחמימות" + "value" : "%1$@ mmol/mol" } }, - "it" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Aggiungi inserimento carboidrati" + "value" : "%1$@ mmol/mol" } }, - "ja" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "糖質の記入を追加" + "value" : "%1$@ mmol/mol" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Legg til karbohydrater" + "value" : "%1$@ mmol/mol" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Kh. Inv. Toevoegen" + "value" : "%1$@ mmol/mol" } }, - "pl" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadź węglowodany" + "value" : "%1$@ mmol/mol" } }, - "pt-BR" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Adicionar Carb" + "value" : "%1$@ mmol/mol" } - }, - "ro" : { + } + } + }, + "%1$@ of %2$@" : { + "comment" : "Trends Loop active tile detail: time in closed loop out of the time Loop status is known. (1: duration in closed loop, e.g. 6d 4h, 2: duration covered, e.g. 7d) Trends: how many days of the period are averaged. (1: days averaged, a number; 2: days in the period, e.g. 14 days)", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați carbohidrați" + "value" : "%1$@ من %2$@" } }, - "ru" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Добавить запись углеводов" + "value" : "%1$@ z %2$@" } }, - "sk" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Zadať sacharidy" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lägg till kolhydrater" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Karb Girişi Ekle" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Khai báo Carb" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加碳水摄入" - } - } - } - }, - "Add CGM" : { - "comment" : "The title of the CGM chooser in settings\nTitle text for button to add CGM device\nTitle text for button to set up a CGM", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "إضافة CGM" - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tilføj CGM" + "value" : "%1$@ af %2$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "CGM hinzufügen" + "value" : "%1$@ von %2$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Agregar MCG" + "value" : "%1$@ de %2$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Lisää CGM" + "value" : "%1$@ / %2$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter un CGM" + "value" : "%1$@ sur %2$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הוסף חיישן" + "value" : "%1$@ מתוך %2$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ / %2$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Aggiungi CGM" + "value" : "%1$@ su %2$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "CGMを追加" + "value" : "%1$@ / %2$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Legg til CGM" + "value" : "%1$@ av %2$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voeg CGM toe" + "value" : "%1$@ van %2$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dodaj CGM" + "value" : "%1$@ z %2$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Adicionar CGM" + "value" : "%1$@ de %2$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați senzor de glicemie" + "value" : "%1$@ din %2$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Добавить CGM" + "value" : "%1$@ из %2$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Pridať CGM" + "value" : "%1$@ z %2$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Lägg till CGM" + "value" : "%1$@ av %2$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "CGM Ekle" + "value" : "%1$@ / %2$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ з %2$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Khai báo CGM" + "value" : "%1$@ / %2$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "添加CGM" + "value" : "%1$@ / %2$@" } } } }, - "Add item to bottom row" : { - "comment" : "Title for Add item", - "extractionState" : "stale", + "%1$@ U/h" : { + "comment" : "Format string for an insulin rate in units per hour. (1: rate)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ وحدة لكل ساعة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/hod" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E/t" + } + }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Wert zur unteren Zeile hinzufügen" + "value" : "%1$@ IE/Std" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/h" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/h" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter un élément à la ligne inférieure" + "value" : "%1$@ U/h" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "U/hr %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/óra" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/ora" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 単位/時" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Tilføy element til bunnraden" + "value" : "%1$@ E/t" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Item toevoegen aan onderste rij" + "value" : "%1$@ E/uur" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ J/h" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/h" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați elementul pe rândul de jos" + "value" : "%1$@ U/oră" } }, - "zh-Hans" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "将项目添加到底行" + "value" : "%1$@ Ед/ч" } - } - } - }, - "Add item to Lock Screen / CarPlay display" : { - "comment" : "Title for Add item", - "localizations" : { - "de" : { + }, + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Element zum Sperrbildschirm / CarPlay-Display hinzufügen" + "value" : "%1$@ J/hod" } }, - "fr" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter un élément à l'écran de verrouillage / CarPlay" + "value" : "%1$@ IE/h" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tilføy en enhet til låseskjermen / CarPlay skjermen" + "value" : "%1$@ Ü/Sa" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Item toevoegen aan toegangsscherm / CarPlay" + "value" : "%1$@ U/год" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați element la ecranul de blocare / afișajul CarPlay" + "value" : "%1$@ U/giờ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "向锁屏 / CarPlay显示 添加项" + "value" : "%1$@ U/小时" } } } }, - "Add Meal" : { - "comment" : "The label of the carb entry button", - "extractionState" : "stale", + "%1$@ vs plan" : { + "comment" : "Basal tile on the Now screen: how the current basal rate differs from the scheduled rate. (1: signed difference in U/h, e.g. +0.25)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "إضافة وجبة" + "value" : "%1$@ مقارنة بالمجدول" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ oproti plánu" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Tilføj måltid" + "value" : "%1$@ ift. plan" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Mahlzeit hinzufügen" + "value" : "%1$@ ggü. Plan" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Agregar Alimento" + "value" : "%1$@ vs. lo programado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Lisää ateria" + "value" : "%1$@ vs. ohjelmoitu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Entrer un repas" + "value" : "%1$@ vs prévu" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הוסף ארוחה" + "value" : "%1$@ לעומת התוכנית" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ a tervhez képest" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Aggiungi pasto" + "value" : "%1$@ vs programmata" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "食事を追加" + "value" : "予定比 %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Legg til måltid" + "value" : "%1$@ mot plan" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voeg maaltijd toe" + "value" : "%1$@ t.o.v. gepland" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dodaj posiłek" + "value" : "%1$@ wzgl. planu" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Adicionar Refeição" + "value" : "%1$@ vs. programado" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați masă" + "value" : "%1$@ față de program" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Добавить еду" + "value" : "%1$@ к плану" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Zadať jedlo" + "value" : "%1$@ oproti plánu" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Lägg till måltid" + "value" : "%1$@ mot schema" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Öğün ekle" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Khai báo bữa ăn" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加用餐信息" - } - } - } - }, - "Add predictive line" : { - "comment" : "Title for predictive line toggle", - "extractionState" : "stale", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prognostizierten BZ-Verlauf hinzufügen" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter une ligne prédictive" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tilføy forutsigende linje" + "value" : "plana göre %1$@" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Voorspellingslijn toevoegen" + "value" : "%1$@ до плану" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați linie predictivă" + "value" : "%1$@ so với lịch" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "添加预测线" + "value" : "较预设 %1$@" } } } }, - "Add Pump" : { - "comment" : "The title of the pump chooser in settings\nTitle text for button to add pump device\nTitle text for button to set up a Pump", + "%1$@ · %2$@ in 5 min" : { + "comment" : "Under the glucose value on the Now screen: the glucose unit and how much glucose changed over 5 minutes. (1: glucose unit, e.g. mmol/L; 2: signed change, e.g. +0.3)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "إضافة مضخة" + "value" : "%1$@ · %2$@ خلال ٥ دقائق" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · %2$@ za 5 min" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Tilføj pumpe" + "value" : "%1$@ · %2$@ på 5 min" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Pumpe hinzufügen" + "value" : "%1$@ · %2$@ in 5 Min" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Agregar Microinfusora" + "value" : "%1$@ · %2$@ en 5 min" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Lisää pumppu" + "value" : "%1$@ · %2$@ / 5 min" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter une pompe" + "value" : "%1$@ · %2$@ en 5 min" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הוסף משאבה" + "value" : "%1$@ · %2$@ ב-5 דק׳" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · %2$@ 5 perc alatt" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Aggiungi pompa" + "value" : "%1$@ · %2$@ in 5 min" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ポンプを追加" + "value" : "%1$@ · 5分で%2$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Legg til pumpe" + "value" : "%1$@ · %2$@ på 5 min" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voeg pomp toe" + "value" : "%1$@ · %2$@ in 5 min" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dodaj pompę" + "value" : "%1$@ · %2$@ w 5 min" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Adicionar Bomba" + "value" : "%1$@ · %2$@ em 5 min" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați pompă" + "value" : "%1$@ · %2$@ în 5 min" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Добавить помпу" + "value" : "%1$@ · %2$@ за 5 мин" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Pridať pumpu" + "value" : "%1$@ · %2$@ za 5 min" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Lägg till pump" + "value" : "%1$@ · %2$@ på 5 min" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Pompa Ekle" + "value" : "%1$@ · 5 dk'da %2$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · %2$@ за 5 хв" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Khai báo bơm" + "value" : "%1$@ · %2$@ trong 5 phút" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "添加泵" + "value" : "%1$@ · 5分钟内%2$@" } } } }, - "Add Service" : { - "comment" : "The title of the add service button in settings\nThe title of the add service picker in settings", + "%1$@ · ending soon" : { + "comment" : "Status pill on the Now screen when a pump pod or CGM sensor is near the end of its life. (1: device name from the pump or CGM plugin, e.g. Omnipod 5)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · ينتهي قريبًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · brzy výměna" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Tilføj tjeneste" + "value" : "%1$@ · udløber snart" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Service hinzufügen" + "value" : "%1$@ · läuft bald ab" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Add Service" + "value" : "%1$@ · termina pronto" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Lisää palvelu" + "value" : "%1$@ · päättyy pian" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter un service" + "value" : "%1$@ · fin proche" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הוסף שרות" + "value" : "%1$@ · מסתיים בקרוב" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · hamarosan lejár" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Aggiungi servizio" + "value" : "%1$@ · in scadenza" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ · まもなく終了" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Legg til tjeneste" + "value" : "%1$@ · utløper snart" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Service toevoegen" + "value" : "%1$@ · verloopt binnenkort" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dodaj usługę" + "value" : "%1$@ · wkrótce wymiana" } }, - "ro" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați Serviciu" + "value" : "%1$@ · terminando em breve" } }, - "ru" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Добавить сервис" + "value" : "%1$@ · expiră curând" } }, - "sv" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Lägg till tjänst" + "value" : "%1$@ · скоро замена" } }, - "tr" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Servis Ekle" + "value" : "%1$@ · čoskoro výmena" } }, - "zh-Hans" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "添加服务" + "value" : "%1$@ · går snart ut" } - } - } - }, - "Adjust Preset Duration" : { - - }, - "Adjusted for" : { - "localizations" : { - "da" : { + }, + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Justeret for" + "value" : "%1$@ · yakında bitiyor" } }, - "de" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Angepasst für" + "value" : "%1$@ · незабаром заміна" } }, - "es" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Ajustado para" + "value" : "%1$@ · sắp hết hạn" } }, - "fi" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Mukautettu" + "value" : "%1$@ · 即将到期" } - }, - "fr" : { + } + } + }, + "%1$@%%" : { + "comment" : "A percentage. (1: number)", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Ajusté(e) pour" + "value" : "%1$@%%" } }, - "it" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Regolato per" + "value" : "%1$@%%" } }, - "nb" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Justert for" + "value" : "%1$@ %%" } }, - "nl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Aangepast voor" + "value" : "%1$@ %%" } }, - "pl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Dostosowane do" + "value" : "%1$@%%" } }, - "ro" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ajustat pentru" + "value" : "%1$@ %%" } }, - "ru" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Скорректировано на" + "value" : "%1$@ %%" } }, - "sv" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Justerad för" + "value" : "%1$@%%" } }, - "tr" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "için düzeltilmiş" + "value" : "%1$@%%" } }, - "zh-Hans" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "已调整" + "value" : "%1$@%%" } - } - } - }, - "Aerobic" : { - - }, - "Afternoon Exercise" : { - - }, - "Alert Identifier" : { - - }, - "Alert Management" : { - "comment" : "Alert Permissions button text\nTitle of alert management screen", - "localizations" : { - "da" : { + }, + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Administration af advarsler" + "value" : "%1$@%%" } }, - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Alarm-Einstellungen" + "value" : "%1$@ %%" } }, - "es" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Gestión de Alertas" + "value" : "%1$@%%" } }, - "fr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Gestion des alertes" + "value" : "%1$@%%" } }, - "he" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "ניהול התראות" + "value" : "%1$@%%" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Gestione avvisi" + "value" : "%1$@%%" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Administrasjon av varsler" + "value" : "%1$@%%" } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Meldingbeheer" + "value" : "%1$@%%" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Zarządzanie alertami" + "value" : "%1$@ %%" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Gestionarea alertelor" + "value" : "%%%1$@" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Управление оповещениями" + "value" : "%1$@%%" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Uyarı Yönetimi" + "value" : "%1$@%%" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "警报管理" + "value" : "%1$@%%" } } } }, - "Alert Permissions" : { - "comment" : "Alert Permissions button text\nNotification & Critical Alert Permissions screen title", - "extractionState" : "stale", + "%1$@%% basal" : { + "comment" : "Trends Insulin per day tile detail: share of insulin delivered as basal. (1: percentage number)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% القاعدية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "bazál %1$@%%" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Alarmtilladelser" + "value" : "%1$@ %% basal" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Benachrichtigungsberechtigungen" + "value" : "%1$@ %% Basal" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Permisos de Alertas" + "value" : "%1$@%% basal" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Hälytysten käyttöoikeudet" + "value" : "%1$@ %% basaalia" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Autorisations d'alerte" + "value" : "%1$@ %% basal" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הרשאות התראה" + "value" : "%1$@%% Basal" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% basal" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Permessi di avviso" + "value" : "%1$@%% basale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ベーサル %1$@%%" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Varslingsinnstillinger" + "value" : "%1$@ %% basal" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Toestemming meldingen" + "value" : "%1$@%% basaal" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Uprawnienia alertów" + "value" : "baza %1$@%%" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% basal" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Permisiuni pentru alarme" + "value" : "%1$@%% bazală" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Разрешение оповещений" + "value" : "базал %1$@%%" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "bazál %1$@%%" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Behörigheter för Varningar" + "value" : "%1$@ %% basal" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Uyarı İzinleri" + "value" : "%%%1$@ bazal" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "базал %1$@%%" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% Basal" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "警报权限" + "value" : "基础 %1$@%%" } } } }, - "Alert Permissions and Mute Alerts" : { - "comment" : "Alert Permissions descriptive text", - "extractionState" : "stale", + "%1$@%% basal · %2$@" : { + "comment" : "Trends Insulin per day tile detail when only some days are averaged. (1: basal share as a percentage number, 2: days averaged, e.g. 5 of 14 days)", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Advarselstilladelser og dæmpede advarsler" + "value" : "%1$@%% القاعدية · %2$@" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Alarmberechtigungen und Stummschalten von Alarmen" + "value" : "bazál %1$@%% · %2$@" } }, - "fr" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Permissions d'alerte et désactivation des alertes auditives" + "value" : "%1$@ %% basal · %2$@" } }, - "he" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "הרשאות התראה והשתקת התראות" + "value" : "%1$@ %% Basal · %2$@" } }, - "it" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Autorizzazioni avvisi e avvisi disattivati" + "value" : "%1$@%% basal · %2$@" } }, - "nb" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Varselstillatelser og demp varsler" + "value" : "%1$@ %% basaalia · %2$@" } }, - "nl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Toestemming voor waarschuwingen en dempen" + "value" : "%1$@ %% basal · %2$@" } }, - "pl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Uprawnienia do alertów i wyciszanie alertów" + "value" : "%1$@%% Basal · %2$@" } }, - "ro" : { + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% basal · %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% basale · %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ベーサル %1$@%% · %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %% basal · %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% basaal · %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "baza %1$@%% · %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% basal · %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% bazală · %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "базал %1$@%% · %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "bazál %1$@%% · %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %% basal · %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%%%1$@ bazal · %2$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "базал %1$@%% · %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% Basal · %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础 %1$@%% · %2$@" + } + } + } + }, + "%1$@%% CGM active" : { + "comment" : "Trends Time in range card: share of the period with CGM readings. (1: percentage number)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% CGM نشط" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM aktivní %1$@%%" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %% CGM aktiv" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %% CGM aktiv" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM activo %1$@%%" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %% CGM aktiivinen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM actif %1$@ %%" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% CGM פעיל" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% CGM aktív" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM attivo %1$@%%" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM稼働 %1$@%%" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %% CGM aktiv" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% CGM actief" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM aktywny %1$@%%" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM ativo %1$@%%" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%% CGM activ" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM активен %1$@%%" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM aktívny %1$@%%" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %% CGM aktiv" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%%%1$@ CGM aktif" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM активний %1$@%%" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM hoạt động %1$@%%" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM 在线 %1$@%%" + } + } + } + }, + "%1$@, %2$@ %3$@: %4$@ percent, %5$@ hours a day" : { + "comment" : "VoiceOver label for a Time in range row. (1: band name, e.g. In range, 2: glucose thresholds, e.g. 3.9–10.0, 3: glucose unit, 4: percentage number, 5: average hours a day with one decimal)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@، %2$@ %3$@: %4$@ بالمئة، %5$@ ساعة يوميًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: procenta — %4$@, hodin denně — %5$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ procent, %5$@ timer om dagen" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ Prozent, %5$@ Stunden pro Tag" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ por ciento, %5$@ horas al día" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ prosenttia, %5$@ tuntia päivässä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@ : %4$@ pour cent, %5$@ heures par jour" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ אחוז, %5$@ שעות ביום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ százalék, napi %5$@ óra" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ percento, %5$@ ore al giorno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@、%2$@ %3$@:%4$@パーセント、1日%5$@時間" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ prosent, %5$@ timer i døgnet" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ procent, %5$@ uur per dag" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: procent — %4$@, godzin dziennie — %5$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ por cento, %5$@ horas por dia" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ procente, %5$@ ore pe zi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: процент — %4$@, часов в день — %5$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: percentá — %4$@, hodín denne — %5$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ procent, %5$@ timmar per dag" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: yüzde %4$@, günde %5$@ saat" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: відсоток — %4$@, годин на день — %5$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@, %2$@ %3$@: %4$@ phần trăm, %5$@ giờ mỗi ngày" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@,%2$@ %3$@:百分之%4$@,每天%5$@小时" + } + } + } + }, + "%lld days" : { + "comment" : "A number of days, e.g. a Trends period or how many days are averaged. (1: number of days) Trends period picker, VoiceOver name for a period of several days. (1: number of days)", + "localizations" : { + "en" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld day" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld days" + } + } + } + } + }, + "ar" : { + "variations" : { + "plural" : { + "zero" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld يوم" + } + }, + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld يوم" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld يوم" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld أيام" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld يومًا" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld يوم" + } + } + } + } + }, + "cs" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld den" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dny" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dne" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dní" + } + } + } + } + }, + "da" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dag" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dage" + } + } + } + } + }, + "de" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Tag" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld Tage" + } + } + } + } + }, + "es" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld día" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld días" + } + } + } + } + }, + "fi" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld päivä" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld päivää" + } + } + } + } + }, + "fr" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld jour" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld jours" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld jours" + } + } + } + } + }, + "he" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld יום" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld ימים" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld ימים" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld ימים" + } + } + } + } + }, + "hu" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nap" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld nap" + } + } + } + } + }, + "it" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld giorno" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld giorni" + } + } + } + } + }, + "ja" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld日" + } + } + } + } + }, + "nb" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dag" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dager" + } + } + } + } + }, + "nl" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dag" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dagen" + } + } + } + } + }, + "pl" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dzień" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dni" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dni" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dnia" + } + } + } + } + }, + "pt-BR" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dia" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dias" + } + } + } + } + }, + "ro" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld zi" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld zile" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld de zile" + } + } + } + } + }, + "ru" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld день" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld дня" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld дней" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld дня" + } + } + } + } + }, + "sk" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld deň" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dni" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dňa" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dní" + } + } + } + } + }, + "sv" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dag" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld dagar" + } + } + } + } + }, + "tr" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld gün" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld gün" + } + } + } + } + }, + "uk" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld день" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld дні" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld днів" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld дня" + } + } + } + } + }, + "vi" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld ngày" + } + } + } + } + }, + "zh-Hans" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld天" + } + } + } + } + } + } + }, + "%lld shorter gaps" : { + "comment" : "Chart note: how many other, shorter gaps in glucose readings there were; follows the longest gap. (1: number of gaps)", + "localizations" : { + "en" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld shorter gap" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld shorter gaps" + } + } + } + } + }, + "ar" : { + "variations" : { + "plural" : { + "zero" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld فجوة أقصر" + } + }, + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld فجوة أقصر" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld فجوة أقصر" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld فجوات أقصر" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld فجوة أقصر" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld فجوة أقصر" + } + } + } + } + }, + "cs" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kratší výpadek" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kratší výpadky" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kratšího výpadku" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kratších výpadků" + } + } + } + } + }, + "da" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kortere hul" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kortere huller" + } + } + } + } + }, + "de" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kürzere Lücke" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kürzere Lücken" + } + } + } + } + }, + "es" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld interrupción más corta" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld interrupciones más cortas" + } + } + } + } + }, + "fi" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld lyhyempi katko" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld lyhyempää katkoa" + } + } + } + } + }, + "fr" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld interruption plus courte" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld interruptions plus courtes" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld interruptions plus courtes" + } + } + } + } + }, + "he" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld פער קצר יותר" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld פערים קצרים יותר" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld פערים קצרים יותר" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld פערים קצרים יותר" + } + } + } + } + }, + "hu" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld rövidebb kimaradás" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld rövidebb kimaradás" + } + } + } + } + }, + "it" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld interruzione più breve" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld interruzioni più brevi" + } + } + } + } + }, + "ja" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "ほか短い欠損%lld件" + } + } + } + } + }, + "nb" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kortere hull" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kortere hull" + } + } + } + } + }, + "nl" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kortere onderbreking" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kortere onderbrekingen" + } + } + } + } + }, + "pl" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld krótsza przerwa" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld krótsze przerwy" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld krótszych przerw" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld krótszej przerwy" + } + } + } + } + }, + "pt-BR" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld interrupção mais curta" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld interrupções mais curtas" + } + } + } + } + }, + "ro" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld întrerupere mai scurtă" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld întreruperi mai scurte" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld de întreruperi mai scurte" + } + } + } + } + }, + "ru" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld короткий пропуск" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld коротких пропуска" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld коротких пропусков" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld коротких пропуска" + } + } + } + } + }, + "sk" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kratší výpadok" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kratšie výpadky" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kratšieho výpadku" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kratších výpadkov" + } + } + } + } + }, + "sv" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kortare lucka" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld kortare luckor" + } + } + } + } + }, + "tr" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld daha kısa boşluk" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld daha kısa boşluk" + } + } + } + } + }, + "uk" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld коротший пропуск" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld коротші пропуски" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld коротших пропусків" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld коротшого пропуску" + } + } + } + } + }, + "vi" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld khoảng trống ngắn hơn" + } + } + } + } + }, + "zh-Hans" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "另有%lld段较短中断" + } + } + } + } + } + } + }, + "+ %1$@ automatic" : { + "comment" : "Trends Boluses per day tile detail: average number of automatic boluses per day on top of the manual ones, a fractional value such as 4.2. (1: number with one decimal)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ تلقائي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automat." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automatiske" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automatisch" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automáticos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automaattista" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automatiques" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ אוטומטיים" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automatikus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automatici" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ 自動 %1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automatiske" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automatisch" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automat." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automáticos" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automate" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ авто" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automat." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ automatiska" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ otomatik" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ авто" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ %1$@ tự động" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "+ 自动 %1$@" + } + } + } + }, + "-" : { + "comment" : "A hyphen.", + "isCommentAutoGenerated" : true + }, + "-.--" : { + + }, + "–" : { + "comment" : "String denoting lack of a recommended bolus amount in the simple bolus calculator" + }, + "." : { + "comment" : "Full stop character", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "-" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "." + } + } + } + }, + "(+1 day)" : { + "comment" : "Text indicating that the stop time is set for the next day.", + "isCommentAutoGenerated" : true + }, + "**Tip: If glucose rises to >270 mg/dl,** check %@ to see if a bolus is recommended to bring your glucose back into range." : { + + }, + "**Tip:** Try exercising when your active insulin is close to zero at the start of an activity." : { + + }, + "**Try:** If you often experience low glucose, consider exercising earlier in the day before eating." : { + + }, + "**Try:** Reducing your meal bolus if you expect your glucose to drop." : { + + }, + "%@" : { + + }, + "%@ " : { + + }, + "%@ %@" : { + "comment" : "The format for an active custom preset. (1: preset symbol)(2: preset name)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + } + } + }, + "%@ absorbed" : { + "comment" : "Formats absorbed carb value", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ استغرق" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ optaget" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ resorbiert" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ absorbido" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ imeytynyt" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ absorbé(s)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ נספג" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ assorbiti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 吸収済" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ absorbert" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ geabsorbeerd" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ zaabsorbowane" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ absorvida" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ absorbiți" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ усвоено" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ absorbované" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ absorberat" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emilen %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ được hấp thụ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 已吸收" + } + } + } + }, + "%@ of insulin" : { + + }, + "%@ read" : { + + }, + "%@ Recommended starting values" : { + + }, + "%@ remaining" : { + "comment" : "Estimated remaining duration with more than a minute", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ tilbage" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ verbleiben" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ restante" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ jäljellä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ restant" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ נותרו" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ rimanenti" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ gjenstår" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ resterend" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pozostało %@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ rămase" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Осталось %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ återstår" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ kaldı" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "剩余 %@" + } + } + } + }, + "%@ U Total" : { + "comment" : "The subtitle format describing total insulin. (1: localized insulin total)", + "extractionState" : "stale", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ وحدة بشكل كامل" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ E Total" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ IE gesamt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U Totales" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U yhteensä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U total" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U סה״כ" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U Totali" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "計 %@ 単位" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ E Totalt" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ E totaal" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ J łącznie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U Total" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U total" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ всего ед" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ j Celkom" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ E totalt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toplam %@ Ü" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ U Tổng cộng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 单位 总量" + } + } + } + }, + "%@-%@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@-%2$@" + } + } + } + }, + "%@." : { + "comment" : "Appends a full-stop to a statement", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ ." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ ." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + } + } + }, + "%@%@ was unable to cancel your current temporary basal rate, which is higher than the new Max Basal limit you have set. This may result in higher insulin delivery than desired.\n\nConsider suspending insulin delivery manually and then immediately resuming to enact basal delivery with the new limit in place." : { + "comment" : "Alert text for failing to cancel temp basal (1: reason description, 2: app name)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@ kunne ikke annullere din nuværende midlertidige basalrate, som er højere end den nye Max basalgrænse, du har indstillet. Dette kan resultere i en højere insulintilførsel end ønsket.\n\nOvervej at suspendere insulintilførslen manuelt og derefter straks genoptage den for at iværksætte basaltilførslen med den nye grænse på plads." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@ konnte Deine aktuelle temporäre Basalrate nicht abbrechen, da diese höher ist als die neue maximale Basalrate, die Du festgelegt hast. Dies kann zu einer höheren Insulinabgabe, als erwünscht führen.\n\nErwäge, die Insulinabgabe manuell zu unterbrechen und dann sofort wieder aufzunehmen, um die Basalabgabe mit dem neuen Grenzwert zu initiieren." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ no pudo cancelar su basal temporal actual, que es más alta que el nuevo límite basal máximo que ha establecido. Esto puede resultar en una administración de insulina superior a la deseada. \n\n Considere suspender la administración de insulina manualmente y luego reanudarla de inmediato para activar la administración basal con el nuevo límite establecido." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ n'a pas pu annuler votre débit basal temporaire actuel, qui est supérieur à la nouvelle limite basale max que vous avez définie. Cela peut entraîner une administration d'insuline plus élevée que souhaitée. \n\nEnvisagez de suspendre l'administration d'insuline manuellement, puis de reprendre immédiatement l'administration basale avec la nouvelle limite en place." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@ non sono stati in grado di cancellare la tua attuale basale temporanea, che è più elevata di quella impostata come nuovo limite massimo di basale. Questo potrebbe comportare una maggiore infusione d'insulina di quanto desiderato. \n\nConsidera di sospendere manualmente l'erogazione d'insulina e quindi di riattivarla immediatamente per attivare l'erogazione d'insulina basale con il corretto limite impostato." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ kunne ikke avbryte den nåværende midlertidige basaldosen, som er høyere enn den nye maksimale basalgrensen du har angitt. Dette kan føre til høyere insulintilførsel enn ønsket. \n\n Vurder å avbryte insulintilførselen manuelt og deretter umiddelbart gjenoppta for å innføre basaltilførsel med den nye grensen på plass." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@%@ kon je huidige tijdelijke basaalstand niet annuleren, die hoger is dan de nieuwe maximale basaallimiet die je hebt ingesteld. Dit kan leiden tot een hogere insulinetoediening dan gewenst. \n\nOverweeg om de insulinetoediening handmatig te onderbreken en dan direct het hervatten van de basaaltoediening uit te laten voeren met de nieuwe geldende limiet." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ nie mógł anulować bieżącej tymczasowej dawki podstawowej, która jest wyższa niż nowy ustawiony limit maksymalnej dawki podstawowej. Może to skutkować wyższym niż pożądane podawaniem insuliny. \n\n Rozważ ręczne wstrzymanie podawania insuliny, a następnie natychmiastowe wznowienie podawania dawki podstawowej z obowiązującym nowym limitem." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ nu a putut anula rata bazală temporară actuală, care este mai mare decât noua limită bazală maximă pe care ați setat-o. Acest lucru poate duce la o administrare de insulină mai mare decât se dorește. \n\nLuați în considerare suspendarea manuală a administrării insulinei și apoi reluarea imediată pentru a pune în aplicare administrarea bazală cu noua limită în vigoare." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@ не смог отменить вашу текущую ВБС, которая превышает установленный вами новый предел максимальной ВБС. Это может привести к большему количеству подаваемого инсулина, чем хотелось бы.\n\nРассмотрите возможность приостановить введение инсулина вручную, а затем немедленно возобновить введение базального инсулина с новым установленным лимитом." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@ nedokázal zrušiť vašu aktuálnu dočasnú bazálnu dávku, ktorá je vyššia ako nový maximálny bazálny limit, ktorý ste nastavili. To môže viesť k vyššiemu dodávaniu inzulínu, ako je požadované.\n\nZvážte ručné pozastavenie podávania inzulínu a následné okamžité obnovenie, aby ste uplatnili novým bazálny limit." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ , ayarladığınız yeni Maks Bazal limitinden daha yüksek olan mevcut geçici bazal oranınızı iptal edemedi. Bu, istenenden daha yüksek insülin iletimi ile sonuçlanabilir. \n\n İnsülin iletimini manuel olarak askıya almayı ve ardından yeni limit geçerliyken bazal iletimi etkinleştirmek için hemen devam etmeyi düşünün." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@%@ 无法取消当前的临时基础率,该基础率高于您新设定的最大基础率上限。这可能导致胰岛素输注量高于预期。\n\n建议您手动暂停胰岛素输注,然后立即恢复,以便根据新的上限重新执行基础输注。" + } + } + } + }, + "%1@%2@" : { + "comment" : "Adds a full-stop to a statement (1: statement, 2: full stop character)", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$1@%2$2@" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$1@%2$2@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$1@%2$2@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$1@%2$2@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$1@%2$2@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$1@%2$2@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$1@%2$2@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$1@%2$2@" + } + } + } + }, + "%1$@ – %2$@ %3$@" : { + "comment" : "Format string for glucose target range. (1: Min target)(2: Max target)(3: glucose unit)", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ - %2$@ %3$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ – %2$@ %3$@" + } + } + } + }, + "%1$@ %2$@" : { + "comment" : "Format string combining carb entry quantity and absorption time emoji", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@%2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@" + } + } + } + }, + "%1$@ %2$@/U" : { + "comment" : "Format string for carb ratio average. (1: value)(2: carb unit)", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/وحدة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/E" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/IE" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ /E" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ /E" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/J" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/ед" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ /j" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/E" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/Ü" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/U" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@/单位" + } + } + } + }, + "%1$@ + %2$@" : { + "comment" : "Format string combining carb entry time and absorption time\nFormats (1: carb start time) and (2: carb absorption duration)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ + %2$@" + } + } + } + }, + "%1$@ also reads insulin data from other apps in Apple Health. Apple Health does not report whether an app may read data, so read access can't be shown here." : { + "comment" : "Health access reading explanation (1: app name)" + }, + "%1$@ APP SOUNDS" : { + "comment" : "App sounds title text (1: app name)", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ APP LYDE" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ SUONI DELL'APP" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ APP-LYDER" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ DŹWIĘKI APLIKACJI" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ЗВУКИ ПРИЛОЖЕНИЯ" + } + } + } + }, + "%1$@ cannot turn your iPhone's volume up for you. Make sure your volume is turned up — especially overnight — or you may not hear urgent alarms. The Mute All App Sounds feature also silences these alarms while it is active." : { + "comment" : "Critical alert audio fallback callout message (1: app name)" + }, + "%1$@ has been active for more than 24 hours. Make sure you still want it enabled, or turn it off in the app." : { + "comment" : "Active preset reminder alert background body. (1: preset name)" + }, + "%1$@ has been active for more than 24 hours. Make sure you still want it enabled, or turn it off." : { + "comment" : "Active preset reminder alert foreground body. (1: preset name)" + }, + "%1$@ has set your correction range to 110 mg/dL or higher." : { + "comment" : "The format string for the high insulin needs preset warning text on the preset detent screen when stopping a preset. (1: app name)" + }, + "%1$@ is operating with Closed Loop in the OFF position. Your pump and CGM will continue operating, but the app will not adjust dosing automatically." : { + "comment" : "Alert message for closed loop off informational modal. (1: app name)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kører med Lukket Loop i positionen OFF. Din pumpe og CGM fortsætter med at fungere, men appen justerer ikke doseringen automatisk." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ arbeitet mit geschlossenem Regelkreis in der AUS-Position. Deine Pumpe und CGM funktionieren weiter, aber die App passt die Dosierung nicht automatisch an." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ está funcionando con Circuito Cerrado en la posición APAGADO. Su bomba y CGM seguirán funcionando, pero la aplicación no ajustará la dosis automáticamente." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ fonctionne avec la boucle fermée en position ARRÊT. Votre pompe et votre CGM continueront de fonctionner, mais l'application n'ajustera pas automatiquement le dosage." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ è in funzione con Loop chiuso disattivato. La pompa e il CGM continueranno a funzionare, ma l'applicazione non regolerà automaticamente il dosaggio." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ opererer med Lukket Loop i AV-posisjon. Pumpen og CGM vil fortsette å fungere, men appen vil ikke justere doseringen automatisk." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ werkt met Actieve loop UIT. Je pomp en CGM blijven werken, maar de app past de dosering niet automatisch aan." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ działa z zamkniętą pętlą w pozycji OFF. Twoja pompa i CGM będą nadal działać, ale aplikacja nie będzie automatycznie dostosowywać insuliny." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ operează cu bucla închisă în poziția OPRIT. Pompa și senzorul de glicemie vor continua să funcționeze, dar aplicația nu va ajusta automat dozarea." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ работает с замкнутым циклом в положении ВЫКЛ. Ваша помпа и CGM будут продолжать работать, но приложение не будет регулировать дозировку автоматически." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ , KAPALI konumda Kapalı Döngü ile çalışıyor. Pompanız ve CGM çalışmaya devam edecek, ancak uygulama dozajı otomatik olarak ayarlamayacaktır." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 当前处于非闭环模式。胰岛素泵和连续血糖监测仪仍将正常运行,但应用程序不会自动调整胰岛素剂量。" + } + } + } + }, + "%1$@ is unable to clear the alert from your device" : { + "comment" : "Message for alert shown when alert acknowledgement fails for a device, and the device does not provide a LocalizedError. (1: app name)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kan ikke slette advarslen fra din enhed" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kann die Benachrichtigung nicht von Deinem Gerät löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ no puede borrar la alerta de su dispositivo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ne parvient pas à supprimer l'alerte de votre dispositif." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ non è in grado di cancellare l'avviso dal tuo dispositivo" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kan ikke fjerne varselet fra enheten din" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kan de melding niet wissen van je apparaat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ nie może usunąć alertu z Twojego urządzenia" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ nu poate șterge alerta de pe dispozitiv" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ не удается удалить предупреждение с вашего устройства" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ , uyarıyı cihazınızdan silemiyor" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 无法清除您设备上的警报。" + } + } + } + }, + "%1$@ is unable to communicate with your insulin pump. The app will continue trying to reach your pump, but insulin delivery information cannot be updated and no automation can continue.\nYou can wait several minutes to see if the issue resolves or tap the button below to learn more about other options." : { + "comment" : "Message for alert shown when delivery status is uncertain. (1: app name)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kan ikke kommunikere med insulinpumpen. Loop vil fortsætte med at forsøge at kommunikere med din pumpe, men insulinafgivelsesoplysninger kan ikke opdateres og ingen automatisering kan fortsætte.\nDu kan vente et par minutter for at se, om problemet bliver løst, eller tryk på knappen nedenfor for at få mere at vide om andre muligheder." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kann nicht mit Deiner Insulinpumpe kommunizieren. Die App versucht weiterhin, Deine Pumpe zu erreichen, aber die Informationen zur Insulinabgabe können nicht aktualisiert werden und die Automatisierung kann nicht fortgesetzt werden.\nDu kannst einige Minuten warten, um zu sehen, ob das Problem behoben ist, oder auf die Schaltfläche unten tippen, um mehr über andere Optionen zu erfahren." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ no puede comunicarse con tu bomba de insulina. La aplicación continuará intentando llegar a tu bomba, pero la información de entrega de insulina no se puede actualizar y ninguna automatización puede continuar.\nPuedes esperar varios minutos para ver si el problema resuelve o pulsa el botón de abajo para saber más sobre otras opciones." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ei pysty kommunikoimaan insuliinipumpun kanssa. Sovellus yrittää edelleen yhdistää pumppuun, mutta insuliininannostelun tiedot eivät päivity, eikä automatiikka ole päällä.\nVoit odottaa muutaman minuutin nähdäksesi ratkeaako ongelma, tai voit napauttaa alla olevaa painiketta saadaksesi lisätietoja muista vaihtoehdoista." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ne parvient pas à communiquer avec votre pompe à insuline. L’application continuera d’essayer d’atteindre votre pompe, mais les informations sur l’administration d’insuline ne peuvent pas être mises à jour et aucune automatisation ne peut continuer.\nVous pouvez attendre quelques minutes pour voir si le problème est résolu ou appuyer sur le bouton ci-dessous pour en savoir plus sur les autres options." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ non riesce a comunicare con la pompa. L'app continuerà a provare a contattare la pompa, ma le informazioni sull'erogazione dell'insulina non possono essere aggiornate e l'automazione non può proseguire. \nPuoi attendere alcuni minuti per vedere se il problema si risolve oppure toccare il pulsante qui sotto per saperne di più sulle altre opzioni." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kan ikke kommunisere med insulinpumpen. Appen vil fortsette å prøve å nå pumpen din, men insulintilførselsinformasjon kan ikke oppdateres og ingen automatisering kan fortsette.\n Du kan vente flere minutter for å se om problemet løser seg eller trykke på knappen nedenfor for å lære mer om andre alternativer." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kan niet communiceren met je insulinepomp. De app blijft proberen je pomp te bereiken, maar de insulinetoedieningsinformatie kan niet worden bijgewerkt en automatisering kan niet plaatsvinden.\nJe kunt enkele minuten wachten om te zien of het probleem is opgelost of tik op de onderstaande knop voor meer informatie over andere opties." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ nie może skomunikować się z Twoją pompą insulinową. Aplikacja będzie nadal próbowała połączyć się z pompą, ale nie można aktualizować informacji o podawaniu insuliny i nie można kontynuować automatyzacji.\n Możesz poczekać kilka minut, aby sprawdzić, czy problem został rozwiązany, lub nacisnąć poniższy przycisk, aby dowiedzieć się więcej o innych opcjach." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ nu poate comunica cu pompa de insulină. Aplicația va continua să încerce să comunice cu pompa, dar informațiile despre administrarea insulinei nu pot fi actualizate și automatizarea nu poate continua.\nPuteți aștepta câteva minute pentru a vedea dacă problema se rezolvă sau apăsați butonul de mai jos pentru a afla mai multe despre alte opțiuni." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ не может связаться с вашей инсулиновой помпой. Приложение будет продолжать попытки связаться с вашей помпой, но информация о доставке инсулина не может быть обновлена, и автоматизация не может продолжаться.\nВы можете подождать несколько минут и посмотреть, разрешится ли проблема, или нажать кнопку ниже, чтобы узнать о других возможностях." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ nedokáže komunikovať s vašou inzulínovou pumpou. Aplikácia sa bude naďalej pokúšať kontaktovať vašu pumpu, ale informácie o podávaní inzulínu nemožno aktualizovať a nemôže pokračovať žiadna automatizácia.\nMôžete počkať niekoľko minút, aby ste zistili, či sa problém vyriešil, alebo klepnutím na tlačidlo nižšie sa dozviete viac o ďalších možnostiach." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ kan inte kommunicera med din insulinpump. Appen kommer att fortsätta att försöka nå din pump, men under tiden kan information om insulintillförsel inte uppdateras och automatisering inte fortsätta.\nDu kan vänta flera minuter för att se om problemet löser sig eller klicka på knappen nedan för att läsa mer om andra alternativ." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ insülin pompanızla iletişim kuramıyor. Uygulama pompanıza ulaşmaya çalışmaya devam edecek, ancak insülin iletim bilgileri güncellenemeyecek ve hiçbir otomasyon devam edemeyecektir.\nSorunun çözülüp çözülmediğini görmek için birkaç dakika bekleyebilir veya diğer seçenekler hakkında daha fazla bilgi edinmek için aşağıdaki butona dokunabilirsiniz." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 无法与您的胰岛素泵通信。应用将继续尝试连接胰岛素泵,但当前无法更新胰岛素输注信息,也无法继续自动化操作。\n\n您可以等待几分钟以观察问题是否自动恢复,或点击下方按钮了解其他可选操作。" + } + } + } + }, + "%1$@ Still Active" : { + "comment" : "The format title for the preset still active alert. (1: preset name)" + }, + "%1$@ Time Settings Need Attention" : { + "comment" : "Time change alert title", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Tidsindstillinger kræver opmærksomhed" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Zeiteinstellungen erfordern Aufmerksamkeit" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ La configuración de la hora necesita atención" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Paramètres d'heure requierent une attention" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ הגדרות השעה דורשות תשומת לב" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Le impostazioni dell'orario richiedono attenzione" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Tidsinnstillinger trenger oppmerksomhet" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Tijdinstellingen hebben aandacht nodig" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Ustawienia czasu wymagają uwagi" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Setările de timp necesită atenție" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Настройки времени требуют внимания" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Zaman Ayarlarına Dikkat Edilmesi Gerekiyor" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 时间设置需要注意" + } + } + } + }, + "%1$@ U" : { + "comment" : "Reservoir entry (1: volume value)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ IE" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "U %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ J" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Ед." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ j" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Ü" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ وحدة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 単位" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U" + } + } + } + }, + "%1$@ U left" : { + "comment" : "Low reservoir alert format string. (1: Number of units remaining)", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ وحدة متبقية" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E tilbage" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ IE verbleibend" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U left" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U restantes" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U jäljellä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U restantes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U נותרו" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U rimaste" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残 %1$@単位" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E igjen" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E over" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ J pozostało" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U restante" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U rămase" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Ед осталось" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zostáva %1$@ j" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E kvar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Ü kaldı" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U còn lại" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 单位 剩余" + } + } + } + }, + "%1$@ U left: %2$@" : { + "comment" : "Low reservoir alert with time remaining format string. (1: Number of units remaining)(2: approximate time remaining)", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ وحدة متبقية: %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E tilbage: %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ IE verbleibend: %2$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U left: %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U restantes: %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U jäljellä: %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U restantes: %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U נותרו: %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U rimaste: %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残 %1$@単位: %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E gjenstår: %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E over: %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ J pozostało: %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U restante: %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U rămase: %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Ед осталось: %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zostáva %1$@ j: %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E kvar: %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Ü kalan: %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U còn lại: %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 单位 剩余: %2$@" + } + } + } + }, + "%1$@ U/hour @ %2$@" : { + "comment" : "The format for recommended temp basal rate and time. (1: localized rate number)(2: localized time)", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ وحدة/ساعة @ %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E/time @ %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ IE/h @ %2$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/hour @ %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/hora @ %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/h klo %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/heure @ %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ יח׳/שעה @ %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/ora @ %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/時 @ %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E/timen @ %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E/uur @ %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ J/godzinę @ %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/hora @ %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/oră @ %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ед/час @ %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ j/hod @ %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ E/h @ %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Ü/saat @ %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ U/giờ @ %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 单位/小时 @ %2$@" + } + } + } + }, + "%1$@ v%2$@" : { + "comment" : "The format string for the app name and version number. (1: bundle name)(2: bundle version)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ версии %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ v%2$@" + } + } + } + }, + "%1$@ will actively adjust your insulin dosing in response to your glucose as often as every 5 minutes." : { + "comment" : "message when automation is on and the glucose value is fresh (1: app name)" + }, + "%1$@ will continue trying to restore automation, but check for potential communication issues with your CGM or insulin pump." : { + "comment" : "message when automation is on and pump is in signal loss (1: app name)\nmessage when automation is on and the glucose value is not fresh (1: app name)" + }, + "%1$@ will continue trying to restore automation, but check for potential communication issues with your CGM.\n\nIn the meantime, your pump is still able to deliver insulin." : { + "comment" : "message when automation is on and CGM is in signal loss (1: app name)" + }, + "%1$@ will set your correction range to 110 mg/dL or higher when this preset is enabled." : { + "comment" : "The format string for the high insulin needs preset warning text on the preset detent screen when starting a preset. (1: app name)" + }, + "%1$@ will stop working in %2$@. You will need to rebuild before that." : { + "comment" : "Format string for body for notification of upcoming expiration. (1: app name) (2: amount of time until expiration", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ holder op med at fungere i %2$@. Du bliver nødt til at rebuilde før det." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ funktioniert in %2$@ nicht mehr. Sie müssen vorher einen Neuaufbau durchführen." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ cessera de fonctionner dans %2$@. Il vous faudra recompiler avant cette échéance." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ smetterà di funzionare tra %2$@. Prima di allora, sarà necessario ricostruirlo." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ vil slutte å fungere i %2$@. Du må gjenoppbygge før det." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ stopt over %2$@ met werken. Bouw de app vóór die tijd opnieuw." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ przestanie działać w %2$@. Konieczna będzie wcześniejsza odbudowa." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ va înceta să funcționeze în %2$@. Va trebui să reconstruiți sistemul înainte de asta." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ перестанет работать в %2$@. До этого времени необходимо пересобрать приложение заново." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@将在%2$@停止工作。您需要在此之前重建。" + } + } + } + }, + "%1$@ will stop working in %2$@. You will need to update before that, with a new provisioning profile." : { + "comment" : "Format string for body for notification of upcoming provisioning profile expiration. (1: app name) (2: amount of time until expiration", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ holder op med at fungere i %2$@. Du skal opdatere inden da med en ny provisioneringsprofil." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ funktioniert nicht mehr in %2$@. Du musst vor Ablauf mit einem neuen Bereitstellungsprofil aktualisieren." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ dejará de funcionar en %2$@ . Deberá actualizar antes de eso, con un nuevo perfil de aprovisionamiento." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ cessera de fonctionner dans %2$@ . Vous devrez mettre à jour avant cela, avec un nouveau profil de provisioning." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ smetterà di funzionare tra %2$@. Prima di allora, sarà necessario effettuare l'aggiornamento con un nuovo profilo di provisioning." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ slutter å fungere om %2$@ . Du må oppdatere før det, med en ny klargjøringsprofil." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ stopt met werken in %2$@. Je zult eerder moeten updaten, met een nieuw beschikbaargesteld profiel." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ przestanie działać za %2$@ . Wcześniej konieczna będzie aktualizacja przy użyciu nowego profilu udostępniania." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ nu va mai funcționa în %2$@. Va trebui să actualizați înainte de aceasta, cu un nou profil de asigurare a accesului." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ перестанет работать в %2$@. Вам нужно будет обновить его до этого, используя новую подпись." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ %2$@ içinde çalışmayı durduracaktır. Bundan önce yeni bir provizyon profili ile güncelleme yapmanız gerekecektir." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 在 %2$@中将无法正常工作。您需要在该版本发布之前,使用新的配置文件进行更新。" + } + } + } + }, + "%1$@: %2$@" : { + "comment" : "Formats (1: carb value) and (2: food type)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ : %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ : %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ : %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@" + } + } + } + }, + "%1$@: %2$@ %3$@" : { + "comment" : "Description of a basal temp basal dose entry (1: title for dose type, 2: value (? if no value) in bold, 3: unit)\nDescription of a bolus dose entry (1: title for dose type, 2: value (? if no value) in bold, 3: unit)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ : %2$@ %3$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@: %2$@ %3$@" + } + } + } + }, + "25–75%" : { + "comment" : "Trends Daily pattern legend: band between the 25th and 75th percentiles of glucose", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75 %" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75 %" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75 %" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75 %" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%25–75" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "25–75%" + } + } + } + }, + "5–95%" : { + "comment" : "Trends Daily pattern legend: band between the 5th and 95th percentiles of glucose", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95 %" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95 %" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95 %" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95 %" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%5–95" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "5–95%" + } + } + } + }, + "absorbs over %1$@ h" : { + "comment" : "Logbook carb row detail: carb absorption time in hours. (1: hours, e.g. 3 or 2.5)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يُمتص خلال %1$@ س" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "vstřebání za %1$@ h" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "optages over %1$@ t" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aufnahme über %1$@ Std" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "se absorbe en %1$@ h" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "imeytyy %1$@ h:ssa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "absorption sur %1$@ h" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נספג במשך %1$@ שע׳" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ óra alatt szívódik fel" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "assorbimento in %1$@ h" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@時間で吸収" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "absorberes over %1$@ t" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "opname in %1$@ u" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "wchłanianie przez %1$@ godz." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "absorve em %1$@ h" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "se absoarbe în %1$@ h" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "усваивается за %1$@ ч" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "vstrebanie za %1$@ h" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "absorberas under %1$@ h" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ sa içinde emilir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "засвоюється за %1$@ год" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "hấp thu trong %1$@ giờ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@小时内吸收" + } + } + } + }, + "Active insulin %1$@, active carbs %2$@" : { + "comment" : "VoiceOver summary of the active insulin and carbs chart. (1: insulin on board, e.g. 1.25 U, or unknown; 2: carbs on board, e.g. 20 g, or unknown)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الأنسولين النشط %1$@، الكارب النشط %2$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivní inzulín %1$@, aktivní sacharidy %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin %1$@, aktive kulhydrater %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktives Insulin %1$@, aktive KH %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina activa %1$@, carbohidratos activos %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akt. insuliini %1$@, akt. hiilari %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insuline active %1$@, glucides actifs %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אינסולין פעיל %1$@, פחמימות פעילות %2$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktív inzulin %1$@, aktív szénhidrát %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina attiva %1$@, carboidrati attivi %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残存インスリン %1$@、残存糖質 %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin %1$@, aktive karbohydrater %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve insuline %1$@, actieve koolhydraten %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktywna insulina %1$@, aktywne węglowodany %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina ativa %1$@, carboidratos ativos %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulină activă %1$@, carbohidrați activi %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Активный инсулин %1$@, активные углеводы %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktívny inzulín %1$@, aktívne sacharidy %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin %1$@, aktiva kolhydrater %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktif insülin %1$@, aktif karb %2$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Активний інсулін %1$@, активні вуглеводи %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulin còn hoạt động %1$@, Carbs còn hoạt động %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "活性胰岛素 %1$@,活性碳水 %2$@" + } + } + } + }, + "Active insulin and carbs" : { + "comment" : "Title of the day page card charting insulin and carbs on board", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الأنسولين والكارب النشطان" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivní inzulín a sacharidy" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin og kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktives Insulin und KH" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina y carbohidratos activos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiivinen insuliini ja hiilihydraatit" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insuline et glucides actifs" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אינסולין ופחמימות פעילים" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktív inzulin és szénhidrát" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina e carboidrati attivi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残存インスリンと残存糖質" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin og karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve insuline en koolhydraten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktywna insulina i węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina e carboidratos ativos" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulină activă și carbohidrați activi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Активный инсулин и углеводы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktívny inzulín a sacharidy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin och kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktif insülin ve karb" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Активний інсулін і вуглеводи" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulin và Carbs còn hoạt động" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "活性胰岛素和碳水" + } + } + } + }, + "Add carbs" : { + "comment" : "Button on the Now screen that opens carb entry", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إضافة كارب" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Přidat sacharidy" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH hinzufügen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agregar carbohidratos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lisää hiilihydraatteja" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter des glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוספת פחמימות" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Szénhidrát hozzáadása" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi carboidrati" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "カーボを追加" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraten toevoegen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adicionar carbs" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить углеводы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pridať sacharidy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb ekle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Додати вуглеводи" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thêm Carbs" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加碳水" + } + } + } + }, + "Add pump" : { + "comment" : "Status pill on the Now screen when no pump is set up; tapping it starts pump setup", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إضافة مضخة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Přidat pumpu" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj pumpe" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpe hinzufügen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agregar microinfusadora" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lisää pumppu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter une pompe" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוספת משאבה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpa hozzáadása" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi pompa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ポンプを追加" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til pumpe" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pomp toevoegen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj pompę" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adicionar bomba" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați pompă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить помпу" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pridať pumpu" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till pump" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pompa ekle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Додати помпу" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thêm bơm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加胰岛素泵" + } + } + } + }, + "All" : { + "comment" : "Logbook filter chip: show every entry", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الكل" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vše" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Todo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kaikki" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tout" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הכל" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mind" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutto" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "すべて" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alles" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wszystko" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tudo" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toate" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Все" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Všetko" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alla" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tümü" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Усі" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tất cả" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部" + } + } + } + }, + "App Icon" : { + "comment" : "Header for the app icon choice", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "أيقونة التطبيق" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikona aplikace" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appsymbol" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "App-Symbol" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icono de la app" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sovelluksen kuvake" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icône de l'app" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "צלמית היישום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alkalmazásikon" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Icona dell'app" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アプリアイコン" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appsymbol" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "App-symbool" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikona aplikacji" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ícone do app" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pictograma aplicației" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Значок приложения" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikona aplikácie" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appsymbol" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uygulama Simgesi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Іконка програми" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Biểu tượng ứng dụng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "App 图标" + } + } + } + }, + "Appearance" : { + "comment" : "Title of the appearance settings screen Title of the light or dark appearance choice", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المظهر" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vzhled" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Udseende" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Darstellung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apariencia" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ulkoasu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apparence" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מראה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Megjelenés" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aspetto" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "外観" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utseende" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weergave" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wygląd" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aparência" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aspect" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оформление" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vzhľad" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utseende" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Görünüm" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вигляд" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giao diện" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "外观" + } + } + } + }, + "Appearance and App Icon" : { + "comment" : "Title of the row that opens the appearance and app icon settings", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المظهر وأيقونة التطبيق" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vzhled a ikona aplikace" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Udseende og appsymbol" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Darstellung und App-Symbol" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apariencia e icono de la app" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ulkoasu ja sovelluksen kuvake" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apparence et icône de l'app" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מראה וצלמית היישום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Megjelenés és alkalmazásikon" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aspetto e icona dell'app" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "外観とアプリアイコン" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utseende og appsymbol" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weergave en app-symbool" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wygląd i ikona aplikacji" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aparência e ícone do app" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aspect și pictograma aplicației" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оформление и значок" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vzhľad a ikona aplikácie" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utseende och appsymbol" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Görünüm ve Uygulama Simgesi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вигляд та іконка" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giao diện và biểu tượng ứng dụng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "外观与 App 图标" + } + } + } + }, + "Automatic" : { + "comment" : "Chart legend: hatched bars are automatic boluses given by Loop", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تلقائي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatické" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisk" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisch" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automático" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automaattinen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatique" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אוטומטי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatikus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatico" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "自動" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisk" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisch" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatyczne" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automático" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automat" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Автоматические" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatické" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisk" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otomatik" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Автоматичні" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tự động" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动" + } + } + } + }, + "Automatic bolus" : { + "comment" : "Chart callout label for a bolus Loop delivered automatically near the touched time Logbook row title: a bolus Loop delivered automatically", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus تلقائي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatický bolus" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisk bolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatischer Bolus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo automático" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automaattinen bolus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus automatique" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus אוטומטי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatikus bólus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo automatico" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "自動ボーラス" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisk bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatische bolus" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus automatyczny" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus automático" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus automat" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Автоматический болюс" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatický bolus" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisk bolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otomatik bolus" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Автоматичний болюс" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus tự động" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自动大剂量" + } + } + } + }, + "%lld" : { + "comment" : "A label displaying the playback speed. The argument is the playback speed.", + "isCommentAutoGenerated" : true + }, + "%lld min" : { + "comment" : "A picker row that lets the user select a snooze interval. The argument is the number of minutes in the interval.", + "isCommentAutoGenerated" : true + }, + "%lld." : { + "comment" : "A number followed by a period, used to number a list of references.", + "isCommentAutoGenerated" : true + }, + "%lld%%" : { + + }, + "%lldd" : { + + }, + "%lldx" : { + "comment" : "A label that shows the playback speed of the audio. The argument is the playback speed.", + "isCommentAutoGenerated" : true + }, + "•" : { + + }, + "<%@" : { + + }, + ">%@" : { + + }, + "⚠️" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️" + } + } + } + }, + "0" : { + + }, + "0.5" : { + "comment" : "A label displayed in the playback speed menu.", + "isCommentAutoGenerated" : true + }, + "0.5x" : { + "comment" : "A label for a playback speed of 0.5x.", + "isCommentAutoGenerated" : true + }, + "1" : { + "comment" : "A label for a playback speed of 1.", + "isCommentAutoGenerated" : true + }, + "1x" : { + "comment" : "A label for the playback speed of 1.", + "isCommentAutoGenerated" : true + }, + "2" : { + "comment" : "A label for a playback speed of 2x.", + "isCommentAutoGenerated" : true + }, + "2x" : { + "comment" : "A label for a playback speed of 2x.", + "isCommentAutoGenerated" : true + }, + "3-6" : { + + }, + "6-9" : { + + }, + "9-20" : { + + }, + "10" : { + + }, + "15 min glucose regression coefficient (b₁), continued with decay over 30 min" : { + "comment" : "Description of the prediction input effect for glucose momentum", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 دقيقة معامل انحدار قراءات سكر الدم (b₁), ويستمر بالاضمحلال خلال 30 دقيقة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 min. glukoseregressionskoefficient (b₁), fortsætter med henfald over 30 minutter." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 Minuten Blutzucker-Regressionskoeffizient (b₁), fortgesetzt mit Abfall über 30 min" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coeficiente de regresión de glucosa de 15 minutos (b₁), continuado con decaimiento durante 30 minutos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 min glukoosin regressiokerroin (b₁), hiipuen 30 min kuluessa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coefficient de régression du glucose de 15 minutes (b1), décroissance poursuivie au-delà de 30 min." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 min glucose regression coefficient (b₁), continued with decay over 30 min" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coefficiente di regressione della glicemia a 15 minuti (b₁), continuato con decadimento per 30 minuti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "15分 グルコース回帰係数 (b₁)、30分退化適用" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 minutters glukose-regresjonskoeffisient (b1), fortsatt med nedbrytning over 30 minutter." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 min glucose regressiecoëficiënt (b₁), gevolgd door afbouw over 30 min" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "15-minutowy współczynnik regresji glukozy (b₁), kontynuowany z rozkładem przez 30 min." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 min coeficiente de regressão de glicose (b₁), continuada com queda em 30 min." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "coeficient de regresie glicemică pe 15 min (b₁), continuat cu o diminuare pe 30 min." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "15-мин коэффициент регрессии гликемии (b1), продолжен с угасанием 30 мин" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 minútový regresný koeficient glykémie (b1), pokračujúci s poklesom počas 30 minút" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 minuters glukosregressionskoefficient (b₁), fortsatt med 30 minuters avklingande" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 dakikalık glikoz regresyon katsayısı (b₁), 30 dakika boyunca bozuk devam etti" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "15 phút hồi quy glucose (b₁), tiếp tục phân rã trên 30 phút." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "15分钟血糖回归系数 (b₁),持续30分钟衰减" + } + } + } + }, + "25-33%" : { + + }, + "30 min comparison of glucose prediction vs actual, continued with decay over 60 min" : { + "comment" : "Description of the prediction input effect for retrospective correction", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 دقيقة مقارنة قراءات سكر الدم المتوقعة والفعلية , ويستمر بالاضمحلال خلال 60 دقيقة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 min. sammenligning af glukose-forudsigelse kontra faktisk målt glukose, med henfald over 60 minutter." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "30-minütiger Vergleich der Blutzuckerprognose gegenüber dem tatsächlichen Blutzucker, Fortsetzung mit Abfall über 60 min" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comparación de glucosa actual contra la proyectada en 30 minutos, continuada con decaimiento durante 60 minutos." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 min vertailu ennustetun ja todellisen glukoosin välillä, hiipuen 60 min kuluessa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comparaison sur 30 min de la glycémie prévue par rapport à celle réelle, suivie d'une décroissance (decay) sur 60 min." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 min comparison of glucose prediction vs actual, continued with decay over 60 min" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confronto di 30 minuti tra la previsione della glicemia e quella effettiva, continuato con decadimento per 60 minuti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "30分 グルコース予想値と実際値の比較、60分退化適用" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 min sammenligning av glukose-prediksjon vs faktisk, fortsatt med nedbrytning over 60 min." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 min vergelijking van glucosevoorspelling versus de werkelijke, gevolgd door afbouw over 60 min" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 minutowe porównanie przewidywania stężenia glukozy w stosunku do rzeczywistego, kontynuowane z rozkładem przez 60 min." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 min de comparação da previsão de glicose vs atual, continuada com queda em 60 min." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comparație timp de 30 de minute între predicția glicemiei și valoarea reală, continuată cu scăderea valorii pe parcursul a 60 de minute" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 мин сравнение предсказанной гликемии с действительной, продолжено с угасанием 60 мин" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 min jämförelse av glukosprediktion och faktiskt värde, fortsatt med 60 miuters avklingande." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 dakikalık glikoz tahmini ile gerçek karşılaştırması, 60 dakika boyunca bozuk devam etti" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 phút so sánh dự đoán glucose so với thực tế, tiếp tục với sự phân rã hơn 60 phút." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "30分钟葡萄糖预测与实际比较,持续60分钟以上衰减" + } + } + } + }, + "100m sprint" : { + + }, + "A critical issue has been discovered in this version of %1$@. To continue using the app, you must update to the latest version." : { + "comment" : "Required update modal paragraph 1 (1: app name)" + }, + "A critical update is available. Your app may not function correctly until you update to the latest version." : { + "comment" : "Software update description for required update" + }, + "A few seconds remaining" : { + "comment" : "Estimated remaining duration with a few seconds", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Et par sekunder tilbage" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ein paar Sekunden verbleiben" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quedan unos segundos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Muutama sekunti jäljellä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quelques secondes restantes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נותרו כמה שניות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pochi secondi rimanenti" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Noen sekunder gjenstår" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nog een paar seconden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pozostało kilka sekund" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Câteva secunde rămase" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Осталось несколько секунд" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Några sekunder återstår" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Birkaç saniye kaldı" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "剩余几秒" + } + } + } + }, + "A manual glucose entry must be between %@ and %@" : { + "comment" : "Alert message for a manual glucose entry out of range error", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En manuel blodsukkerindtastning skal være mellem %1$@ og %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der manuelle Blutzucker muss zwischen %1$@ und %2$@ liegen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Una entrada de glucosa manual debe estar entre %1$@ y %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Syötetyn glukoosiarvon on oltava välillä %1$@ – %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une saisie manuelle de la glycémie doit être comprise entre %1$@ et %2$@." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un inserimento manuale della glicemia deve essere compreso tra %1$@ e %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En manuell BS-registrering må være mellom %1$@ og %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Een handmatige glucose-invoer moet tussen %1$@ en %2$@ liggen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ręczny wpis poziomu glukozy musi mieścić się w przedziale od %1$@ do %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "O intrare manuală de glicemie trebuie să fie între %1$@ și %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ручной ввод глюкозы должен находиться между %1$@ и %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det manuellt inmatade blodsockervärdet måste vara mellan %1$@ och %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manuel KŞ girişi %1$@ ile %2$@ arasında olmalıdır" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请输入 %@ 到 %@ 之间的血糖值" + } + } + } + }, + "A manual glucose entry must be between %1$@ and %2$@." : { + "comment" : "Warning for simple bolus when glucose entry is out of range. (1: upper bound) (2: lower bound)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En manuel glukoseindtastning skal være mellem %1$@ og %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der manuelle Blutzucker muss zwischen %1$@ und %2$@ liegen." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Una entrada de glucosa manual debe estar entre %1$@ y %2$@ ." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une saisie manuelle de la glycémie doit être comprise entre %1$@ et %2$@." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הזנת גלוקוז ידנית חייבת להיות בין %1$@ ל- %2$@." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un inserimento manuale della glicemia deve essere compreso tra %1$@ e %2$@." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En manuell BS-registrering må være mellom %1$@ og %2$@ ." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Een handmatige glucose-invoer moet tussen %1$@ en %2$@ liggen." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ręczny wpis poziomu glukozy musi mieścić się w przedziale od %1$@ do %2$@ ." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "O intrare manuală de glicemie trebuie să fie între %1$@ și %2$@ ." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ручной ввод глюкозы должен находиться между %1$@ и %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manuel KŞ girişi %1$@ ile %2$@ arasında olmalıdır." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请输入 %1$@ 到 %2$@ 之间的血糖值" + } + } + } + }, + "A model based on the published absorption of Fiasp insulin." : { + "comment" : "Subtitle of Fiasp preset", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نموذج يستند على امتصاص أنسولين Fiasp." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En model baseret på publiceret data om absorption af Fiasp insulin." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ein Modell basierend auf der veröffentlichten Resorption von Fiasp-Insulin." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "A model based on the published absorption of Fiasp insulin." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un modelo basado en la publicación de la absorción de insulina Fiasp." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Perustuu Fiasp-insuliinin julkaistuun imeytymismalliin." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un modèle basé sur l’absorption de l’insuline FIASP (telle que publiée)." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "A model based on the published absorption of Fiasp insulin." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un modello basato sull'assorbimento pubblicato dell'insulina Fiasp." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiaspインスリンの公表吸収率に基づいたモデル。" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En modell basert på publisert absorpsjon av Fiasp-insulin." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Een model gebaseerd op de gepubliceerde opname van Fiasp insuline." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Model oparty na opublikowanej absorpcji insulin Fiasp." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Um modelo baseado na absorção publicada da insulina Fiasp." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un model bazat pe absorbția declarată a insulinei Fiasp." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Модель, основанная на опубликованных данных усвоения FIASP инсулина." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Model založený na publikovanej absorpcii inzulínu Fiasp." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulinmodell baserad på publicerade studier av absorption av Fiasp-insulin." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp insülininin yayınlanmış emilimine dayanan bir model." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mô hình dựa trên sự hấp thụ được công bố đối với insulin Fiasp." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基于公布的Fiasp胰岛素吸收的模型" + } + } + } + }, + "A model based on the published absorption of Humalog, Novolog, and Apidra insulin in adults." : { + "comment" : "Subtitle of Rapid-Acting – Adult preset", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نموذج يستند على امتصاص أنسولين Humalog و Novolog و Apidra لدى البالغين." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En model baseret på publiceret data om absorption Humalog, Novolog, og Apidra insulin hos voksne." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ein Modell auf der Grundlage der veröffentlichten Resorption von Humalog, Novolog und Apidra Insulin bei Erwachsenen." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "A model based on the published absorption of Humalog, Novolog, and Apidra insulin in adults." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un modelo basado en la publicación de la absorción de insulina Humalog, Novolog y Apidra en adultos." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Perustuu Humalog-, Novorapid- ja Apidra-insuliinien julkaistuun imeytymismalliin aikuisilla." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un modèle basé sur les absorptions de l’Humalog, Novolog (Novorapid), et Apidra chez l’adulte (telles que publiées)." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "A model based on the published absorption of Humalog, Novolog, and Apidra insulin in adults." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un modello basato sull'assorbimento pubblicato dell'insulina Humalog, Novolog e Apidra negli adulti." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "大人使用時の Humalog、Novolog、Apidraインスリンの公表吸収率に基づいたモデル。" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En modell basert på publisert absorpsjon av Humalog, Novolog og Apidra insulin hos voksne." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Een model gebaseerd op de gepubliceerde absorptie van Humalog-, Novolog- en Apidra-insuline bij volwassenen." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Model oparty na opublikowanej absorpcji insulin Humalog, Novolog/Novorapid i Apidra u dorosłych." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Um modelo baseado na absorção publicada das insulinas Humalog, Novolog e Apidra em adultos." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un model bazat pe absorbția declarată a insulinei Humalog, Novolog și Apidra la adulți." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Модель, основанная на опубликованных данных усвоения Humalog, Novolog и Apidra у взрослых." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Model založený na publikovanej absorpcii inzulínu Humalog, Novolog a Apidra u dospelých." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulinmodell baserad på publicerade studier av absorption av Humalog-, Novolog- samt Apidra-insulin hos vuxna." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yetişkinlerde yayınlanmış Humalog, Novolog ve Apidra insülin emilimine dayalı bir model." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mô hình dựa trên sự hấp thụ được công bố của các loại insulin Humalog, Novolog và Apidra ở người lớn." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基于已发表的成人使用优泌乐、诺和锐和爱倍达胰岛素吸收数据的模型。" + } + } + } + }, + "A new version of %@ is available and is recommended to continue using the app." : { + "comment" : "Software update available section footer (1: app name)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En ny version af %@ er tilgængelig og anbefales for at fortsætte med at bruge appen." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eine neue Version von %@ ist verfügbar und es wird empfohlen, die App weiterhin zu verwenden." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hay una nueva versión de %@ disponible y se recomienda continuar usando la aplicación." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une nouvelle version de %@ est disponible et est recommandée pour continuer à utiliser l'application." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È disponibile una nuova versione di %@ e si consiglia di continuare a utilizzare l'app." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En ny versjon av %@ er tilgjengelig og anbefales for å fortsette å bruke appen." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er is een nieuwe versie van %@ beschikbaar die aanbevolen wordt om de app te kunnen blijven gebruiken." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dostępna jest nowa wersja %@, która jest zalecana do dalszego korzystania z aplikacji." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "O nouă versiune de %@ este disponibilă și se recomandă să continuați să utilizați aplicația." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Новая версия %@ доступна и рекомендуется для продолжения использования приложения." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 'ın yeni bir sürümü mevcut ve uygulamayı kullanmaya devam etmeniz önerilir." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 已推出新版本,建议您继续使用该应用。" + } + } + } + }, + "A new version of %@ is available." : { + "comment" : "Required software update section footer (1: app name)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En ny version af %@ er tilgængelig." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eine neue Version von %@ ist verfügbar." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hay una nueva versión de %@ disponible." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une nouvelle version de %@ est disponible." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È disponibile una nuova versione di %@." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En ny versjon av %@ er tilgjengelig." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er is een nieuwe versie van %@ beschikbaar." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dostępna jest nowa wersja %@ ." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Este disponibilă o nouă versiune de %@ ." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Доступна новая версия %@ ." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yeni bir %@ sürümü mevcuttur." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@有新版本可用。" + } + } + } + }, + "A percentage **above 100%** tells the system you need **more** insulin" : { + + }, + "A percentage **below 100%** tells the system you need **less** insulin" : { + + }, + "A preset with %@ overall insulin is on. The system is currently delivering less than your preset baseline." : { + + }, + "A preset with %@ overall insulin is on. The system is currently delivering more than your preset baseline." : { + + }, + "A preset with %@ overall insulin is on. This is your new preset baseline and it overrides your Scheduled Basal." : { + + }, + "A pump must be configured before a bolus can be delivered." : { + "comment" : "Alert message for a missing pump error", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En pumpe skal være konfigureret, før en bolus kan leveres." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eine Pumpe muss konfiguriert werden, bevor ein Bolus abgegeben werden kann." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Una microinfusadora debe ser configurada antes de que un bolo pueda ser entregado." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumppu on määritettävä, ennen kuin bolus voidaan annostella." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une pompe doit être configurée avant qu'un bolus puisse être administré." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prima di poter erogare un bolo, è necessario configurare una pompa." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En pumpe må konfigureres før en bolus kan tilføres." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Een pomp moet worden geconfigureerd voordat een bolus kan worden toegediend." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przed podaniem bolusa należy skonfigurować pompę." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "O pompă trebuie configurată înainte ca un bolus să poată fi administrat." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Перед введением болюса необходимо настроить помпу." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "En pump måste ha lagts till och konfigurerats innan en bolus ge ges." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus iletilmeden önce bir pompanın yapılandırılması gerek." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在注射大剂量前,必须先配置胰岛素泵。" + } + } + } + }, + "Above range (>180): %d%% · goal <25%%" : { + "comment" : "TIR above-range summary" + }, + "Absorbed by %1$@" : { + "comment" : "Under the end of the carb absorption curve: when the carbs will have absorbed (1: time)" + }, + "Absorption Time" : { + "comment" : "Label for food absorption entry on add favorite food screen", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resorptionsdauer" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temps d'absorption" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "זמן ספיגה" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Absorpsjonstid" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opnametijd" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timp de absorbție" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "吸收时间" + } + } + } + }, + "AcceptRecommendedBolus" : { + "comment" : "Action to copy the recommended Bolus value to the actual Bolus Field", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "استخدم قيمة الجرعة الموصى بها" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "AccepterAnbefaletBolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akzeptiere empfohlenen Bolus" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "AcceptRecommendedBolus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "AceptarBoloRecomendado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "HyväksySuositeltuBolus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "AcceptRecommendedBolus" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "AcceptRecommendedBolus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "AcceptRecommendedBolus" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "推奨ボーラス値を使う" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "AksepterAnbefaltBolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "AccepteerVoorgesteldeBolus" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "AcceptRecommendedBolus" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "AceitarBolusRecomendado" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "AcceptațiBolusRecomandat" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Принятьрекомендуемыйболюс" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akceptovať Odporúčaný Bolus" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "AcceptRecommendedBolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ÖnerilenBolusuKabulEt" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "AcceptRecommendedBolus" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "接受推荐的大剂量输注" + } + } + } + }, + "Active Carbohydrates" : { + "comment" : "The title of the Carbs On-Board graph", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الكربوهيدرات النشطة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktive kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktive Kohlenhydrate" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidratos Activos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiivinen hiilihydraatti" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucides actifs" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פחמימות פעילות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidrati attivi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残存糖質" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktive karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve koolhydraten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktywne węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidratos Ativos" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidrați activi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Действующие углеводы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktívne sacharidy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiva kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktif Karbonhidrat" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lượng Carbohydrates còn hoạt động" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "活性碳水" + } + } + } + }, + "Active Carbohydrates: %@" : { + "comment" : "The string format describing active carbohydrates. (1: localized glucose value description)", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الكربوهيدرات النشطة: %@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktive kulhydrater: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktive Kohlenhydrate: %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Active Carbohydrates: %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidratos Activos: %@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiivinen hiilihydraatti: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucides actifs: %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פחמימות פעילות: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidrati attivi: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残存糖質: %@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktive karbohydrater: %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve koolhydraten: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktywne węglowodany: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidratos Ativos: %@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidrați activi: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Действующие углеводы: %@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktívne sacharidy: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiva kolhydrater: %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktif Karbonhidrat: %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lượng Carbohydrates còn hoạt động: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "活性碳水化合物: %@" + } + } + } + }, + "Active Carbs" : { + "comment" : "Title describing quantity of still-absorbing carbohydrates", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "كارب النشط" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktive kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktive KH" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidratos Activos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akt. hiilari" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucides actifs" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פחמימות פעילות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidrati attivi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残存糖質" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktive karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve koolhydraten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktywne węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidratos Ativos" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidrați activi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Активные углеводы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktívne sacharidy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiva kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktif Karb." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lượng Carbs còn hoạt động" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "活性碳水" + } + } + } + }, + "Active Insulin" : { + "comment" : "Details for missing data error when active insulin amount is missing\nThe title of the Insulin On-Board graph\nTitle describing quantity of still-absorbing insulin", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "أنسولين نشط" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktives Insulin" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina activa" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Akt. insuliini" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insuline active" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אינסולין פעיל" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina attiva" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残存インスリン" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve insuline" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktywna insulina" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina Ativa" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulină activă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Активный инсулин" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktívny inzulín" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktif İnsülin" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lượng Insulin còn hoạt động" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "活性胰岛素" + } + } + } + }, + "Active Insulin: %@" : { + "comment" : "The string format describing active insulin. (1: localized insulin value description)", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الأنسولين النشط: %@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiv insulin: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktives Insulin: %@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Active Insulin: %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina Activa: %@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiivinen insuliini: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insuline active: %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אינסולין פעיל: %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina attiva: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残存インスリン: %@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin: %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve insuline: %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktywna Insulina: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina Ativa: %@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulină activă: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Действующий инсулин: %@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktívny inzulín: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivt insulin: %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktif İnsülin: %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lượng Insulin còn hoạt động: %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "活性胰岛素: %@" + } + } + } + }, + "Add a new favorite food" : { + "comment" : "Button label to open new favorite food view", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj en ny favoritmad" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Füge ein neues Lieblingsessen hinzu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter un nouveau plat préféré" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוסף מאכל אהוב חדש" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi un nuovo cibo preferito" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til en ny favorittmat" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voeg een nieuw favoriet eten toe" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj nowe ulubione jedzenie" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați o nouă mâncare preferată" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加常用食物" + } + } + } + }, + "Add Alert Profile" : { + "comment" : "The text of a button that allows a user to add a new alert profile.", + "isCommentAutoGenerated" : true + }, + "Add Carb Entry" : { + "comment" : "Title of the user activity for adding carbs", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add Carb Entry" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH hinzufügen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agregar Entrada de Carb" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lisää hiilihydraatteja" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter des glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוספת פחמימות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi inserimento carboidrati" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "糖質の記入を追加" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kh. Inv. Toevoegen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wprowadź węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adicionar Carb" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить запись углеводов" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zadať sacharidy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb Girişi Ekle" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khai báo Carb" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加碳水摄入" + } + } + } + }, + "Add CGM" : { + "comment" : "The title of the CGM chooser in settings\nTitle text for button to add CGM device\nTitle text for button to set up a CGM", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إضافة CGM" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj CGM" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM hinzufügen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agregar MCG" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lisää CGM" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter un CGM" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוסף חיישן" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi CGM" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGMを追加" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til CGM" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voeg CGM toe" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj CGM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adicionar CGM" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați senzor de glicemie" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить CGM" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pridať CGM" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till CGM" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM Ekle" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khai báo CGM" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加CGM" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Přidat CGM" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM hozzáadása" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Додати CGM" + } + } + } + }, + "Add item to bottom row" : { + "comment" : "Title for Add item", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wert zur unteren Zeile hinzufügen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter un élément à la ligne inférieure" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføy element til bunnraden" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Item toevoegen aan onderste rij" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați elementul pe rândul de jos" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "将项目添加到底行" + } + } + } + }, + "Add item to Lock Screen / CarPlay display" : { + "comment" : "Title for Add item", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Element zum Sperrbildschirm / CarPlay-Display hinzufügen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter un élément à l'écran de verrouillage / CarPlay" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføy en enhet til låseskjermen / CarPlay skjermen" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Item toevoegen aan toegangsscherm / CarPlay" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați element la ecranul de blocare / afișajul CarPlay" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "向锁屏 / CarPlay显示 添加项" + } + } + } + }, + "Add Meal" : { + "comment" : "The label of the carb entry button", + "extractionState" : "stale", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إضافة وجبة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj måltid" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mahlzeit hinzufügen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agregar Alimento" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lisää ateria" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrer un repas" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוסף ארוחה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi pasto" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "食事を追加" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til måltid" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voeg maaltijd toe" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj posiłek" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adicionar Refeição" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați masă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить еду" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zadať jedlo" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till måltid" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Öğün ekle" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khai báo bữa ăn" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加用餐信息" + } + } + } + }, + "Add predictive line" : { + "comment" : "Title for predictive line toggle", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognostizierten BZ-Verlauf hinzufügen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter une ligne prédictive" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføy forutsigende linje" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voorspellingslijn toevoegen" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați linie predictivă" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加预测线" + } + } + } + }, + "Add Pump" : { + "comment" : "The 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" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إضافة مضخة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj pumpe" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpe hinzufügen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agregar Microinfusora" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lisää pumppu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter une pompe" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוסף משאבה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi pompa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ポンプを追加" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til pumpe" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voeg pomp toe" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj pompę" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adicionar Bomba" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați pompă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить помпу" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pridať pumpu" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till pump" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pompa Ekle" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khai báo bơm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加泵" + } + } + } + }, + "Add Service" : { + "comment" : "The title of the add service button in settings\nThe title of the add service picker in settings", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj tjeneste" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Service hinzufügen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add Service" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lisää palvelu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter un service" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוסף שרות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi servizio" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til tjeneste" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Service toevoegen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj usługę" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați Serviciu" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить сервис" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till tjänst" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Servis Ekle" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加服务" + } + } + } + }, + "Adjust Preset Duration" : { + + }, + "Adjusted for" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Justeret for" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Angepasst für" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustado para" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mukautettu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajusté(e) pour" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regolato per" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Justert for" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aangepast voor" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dostosowane do" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustat pentru" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Скорректировано на" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Justerad för" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "için düzeltilmiş" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已调整" + } + } + } + }, + "Aerobic" : { + + }, + "Afternoon Exercise" : { + + }, + "Alert Identifier" : { + + }, + "Alert Management" : { + "comment" : "Alert Permissions button text\nTitle of alert management screen", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administration af advarsler" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alarm-Einstellungen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gestión de Alertas" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gestion des alertes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ניהול התראות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gestione avvisi" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administrasjon av varsler" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meldingbeheer" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zarządzanie alertami" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gestionarea alertelor" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Управление оповещениями" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uyarı Yönetimi" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "警报管理" + } + } + } + }, + "Alert Permissions" : { + "comment" : "Alert Permissions button text\nNotification & Critical Alert Permissions screen title", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alarmtilladelser" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benachrichtigungsberechtigungen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permisos de Alertas" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hälytysten käyttöoikeudet" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autorisations d'alerte" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הרשאות התראה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permessi di avviso" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Varslingsinnstillinger" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toestemming meldingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uprawnienia alertów" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permisiuni pentru alarme" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Разрешение оповещений" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Behörigheter för Varningar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uyarı İzinleri" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "警报权限" + } + } + } + }, + "Alert Permissions and Mute Alerts" : { + "comment" : "Alert Permissions descriptive text", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Advarselstilladelser og dæmpede advarsler" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alarmberechtigungen und Stummschalten von Alarmen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permissions d'alerte et désactivation des alertes auditives" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הרשאות התראה והשתקת התראות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autorizzazioni avvisi e avvisi disattivati" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Varselstillatelser og demp varsler" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toestemming voor waarschuwingen en dempen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uprawnienia do alertów i wyciszanie alertów" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permisiuni de alertă și alerte silențioase" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Разрешения на оповещения и отключение звука оповещений" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "警报权限与静音设置" + } + } + } + }, + "Alert Profiles" : { + "comment" : "A header label for the list of alert profiles.", + "isCommentAutoGenerated" : true + }, + "Alerts" : { + "comment" : "The title of the view.", + "isCommentAutoGenerated" : true + }, + "Algorithm Experiments" : { + "comment" : "Navigation title for algorithms experiments screen\nThe title of the Algorithm Experiments section in settings", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritme-eksperimenter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algorithmus-Experimente" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Essais d'algorithmes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ניסויי אלגוריתמים" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esperimenti algoritmo" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritmeeksperimenter" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritme experimenten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algorytmy Eksperymentalne" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Experimente algoritmice" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "算法实验" + } + } + } + }, + "Algorithm Experiments are optional modifications to the Loop Algorithm. These modifications are less tested than the standard Loop Algorithm, so please use carefully." : { + "comment" : "Algorithm Experiments description.", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritmeeksperimenter er valgfrie ændringer af Loop-algoritmen. Disse ændringer er mindre testet end standard Loop-algoritmen, så brug venligst omhyggeligt." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algorithmus-Experimente sind optionale Modifikationen des Loop-Algorithmus. Diese Modifikationen sind weniger getestet als der Standard-Loop-Algorithmus. Verwende sie daher mit Vorsicht." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Les essais d'algorithme sont des modifications optionnelles de l'algorithme Loop. Ces modifications sont moins testées que l'algorithme Loop standard, alors veuillez les utiliser avec précaution." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gli esperimenti sull'algoritmo sono modifiche opzionali all'algoritmo di Loop. Queste modifiche sono meno testate rispetto all'algoritmo Loop standard, quindi utilizzale con attenzione." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritmeeksperimenter er valgfrie modifikasjoner til Loop-algoritmen. Disse modifikasjonene er mindre testet enn standard Loop-algoritmen, så vær vennlig å bruke dem med forsiktighet." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritme-experimenten zijn optionele aanpassingen aan het Loop-algoritme. Deze aanpassingen zijn minder grondig getest dan het standaard Loop-algoritme, dus gebruik ze voorzichtig." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksperymenty algorytmiczne to opcjonalne modyfikacje algorytmu pętli. Te modyfikacje są mniej przetestowane niż standardowy algorytm pętli, więc używaj ich ostrożnie." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Experimentele algoritmice sunt modificări opționale ale algoritmului de buclă. Aceste modificări sunt mai puțin testate decât algoritmul de buclă standard, așa că vă rugăm să le utilizați cu atenție." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "算法实验是对 Loop 算法的可选调整。这些调整的测试程度低于标准算法,请谨慎启用。" + } + } + } + }, + "Algorithm Settings" : { + "comment" : "The title of the section containing algorithm settings", + "extractionState" : "manual", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indstillinger for algoritme" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algorithmus-Einstellungen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustes de Algoritmo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritmin asetukset" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paramètres de l'algorithme" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algorithm Settings" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impostazioni algoritmo" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritmeinnstillinger" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritme-instellingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ustawienia algorytmu" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Setări algoritm" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Настройки алгоритма" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritminställningar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritma Ayarları" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "算法设置" + } + } + } + }, + "All Alerts Muted" : { + "comment" : "Warning text for when alerts are muted", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle alarmer er slået fra" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle Warnungen stummgeschaltet" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toutes les alertes sont en sourdine" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כל ההתראות משותקות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutti gli avvisi disattivati" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle varsler er dempet" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle waarschuwingen gedempt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wszystkie alerty wyciszone" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toate alertele sunt dezactivate" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有警报已静音" + } + } + } + }, + "All alerts muted until" : { + "comment" : "Label for when mute alert will end", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle advarsler er slået fra indtil" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle Alarme stummgeschaltet bis" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toutes les alertes auditives sont désactivées jusqu'à" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כל ההתראות מושתקות עד" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutti gli avvisi disattivati fino a" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle varsler er dempet inntil" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle waarschuwingen gedempt tot" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wszystkie alerty wyciszono do" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toate alertele sunt dezactivate până la" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "所有警报均已静音,直至……" + } + } + } + }, + "All App Sounds Muted" : { + "comment" : "Warning text for when alerts are muted" + }, + "All app sounds, including sounds for all critical alerts such as Urgent Low, Sensor Fail, Pump Expiration, and others will NOT sound." : { + "comment" : "Warning label that all alerts will not sound" + }, + "All app sounds, including sounds for all critical alerts, are currently muted.\n\nTap Unmute to resume app sounds for your alerts." : { + "comment" : "The alert body for unmute alert confirmation" + }, + "All Events" : { + + }, + "All Favorites" : { + "comment" : "section header for list of existing FavoriteFoods", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle favoritter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle Favoriten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tous les favoris" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tutti i preferiti" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle favoritter" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle favorieten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wszystkie ulubione" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toate favoritele" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部常用" + } + } + } + }, + "All Out" : { + + }, + "All Presets" : { + + }, + "Allowed" : { + "comment" : "Health sharing status: authorized" + }, + "Also alert from Loop" : { + "comment" : "A toggle that lets the user enable or disable Loop's alerts for a specific profile.", + "isCommentAutoGenerated" : true + }, + "Amount Consumed" : { + "comment" : "Label for carb quantity entry row on carb entry screen", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forbrugt mængde kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH-Menge gegessen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quantité consommée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כמות שנצרכה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quantità consumata" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mengde karbohydrater\n(Mengde inntatt)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gegeten hoeveelheid" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ilość węglowodanów" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cantitate consumată" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "摄入量" + } + } + } + }, + "Amplitude" : { + "comment" : "The title of the Amplitude service", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ampiezza" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplituda" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "Amplitude" + } + } + } + }, + "An active override is modifying your carb ratio and insulin sensitivity. If you don't want this to affect your bolus calculation and projected glucose, consider turning off the override." : { + "comment" : "Warning to ensure the carb entry is accurate during an override", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En aktiv Override ændrer dit kulhydratforhold og din insulinfølsomhed. Hvis du ikke ønsker, at dette skal påvirke din bolusberegning og dit forventede glukose, kan du overveje at slå Override fra." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eine aktive Voreinstellung verändert Dein Kohlenhydratverhältnis und Deine Insulinempfindlichkeit. Wenn Du nicht möchtest, dass sich dies auf Deine Bolusberechnung und Deinen prognostizierten Blutzucker auswirkt, solltest Du die Voreinstellung deaktivieren." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un Ajuste Temporal activo modifica la proporción de carbohidratos y la sensibilidad a la insulina. Si no deseas que esto afecte el cálculo del bolo y la glucosa proyectada, considera desactivar el Ajuste Temporal." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un ajustement actif modifie votre ratio de glucides et votre sensibilité à l'insuline. Si vous ne voulez pas que cela affecte le calcul du bolus et votre glycémie projetée, envisagez de désactiver l'ajustement." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un Override attivo sta modificando il rapporto di carboidrati e la sensibilità insulina. Se non si vuole che questo influisca sul calcolo del bolo e sulla glicemia prevista, si consiglia di disattivare la funzione di Override." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En aktiv overstyring modifiserer ditt karbohydratforhold og insulinfølsomhet. Hvis du ikke vil at dette skal påvirke bolusberegningen og projisert blodsukker, bør du vurdere å slå av overstyringen." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Een actieve override wijzigt je koolhydraatratio en je insulinegevoeligheid. Als je niet wilt dat dit je bolusberekening en voorspelde glucose beïnvloedt, kun je overwegen de override uit te schakelen." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktywny Cel Tymczasowy (Override) modyfikuje stosunek węglowodanów i wrażliwość na insulinę. Jeśli nie chcesz, aby wpłynęło to na obliczenie bolusa i przewidywaną glikemię, rozważ wyłączenie Celu Tymczasowego." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "O suprascriere activă a schimbat raportul dintre carbohidrați și insulină cât și sensibilitatea la insulină. Dacă nu doriți ca acest lucru să vă afecteze calculul bolusului și gllicemia prognozată, luați în considerare dezactivarea suprascrierii." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Активные временные цели изменяют соотношение углеводов и чувствительность к инсулину. Если вы не хотите, чтобы это влияло на расчет болюса и прогнозируемый уровень глюкозы, отключите эту функцию." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktif bir geçersiz kılma, karbonhidrat oranınızı ve insülin duyarlılığınızı değiştiriyor. Bunun bolus hesaplamanızı ve öngörülen glikozu etkilemesini istemiyorsanız geçersiz kılmayı kapatmayı düşünün." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当前启用的覆盖设置正在修改您的碳水比和胰岛素敏感系数。\n如果您不希望其影响大剂量的计算和预测血糖,请考虑关闭该覆盖设置。" + } + } + } + }, + "An error occurred while trying to save your carb entry." : { + "comment" : "Alert message for a carb entry persistence error", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der opstod en fejl under forsøget på at gemme kulhydratindtastning." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beim Speichern Deiner Eingabe der Kohlenhydrate ist ein Fehler aufgetreten." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se produjo un error al intentar guardar la entrada de carbohidratos." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Virhe hiilihydraattien tallennuksessa." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une erreur est survenue lors de l'enregistrement de votre saisie manuelle de glucides." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si è verificato un errore durante il tentativo di salvare l'inserimento dei carboidrati." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det oppstod en feil under forsøk på å lagre karbohydratregistreringen." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er is een fout opgetreden tijdens het opslaan van je koolhydraatinvoer." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wystąpił błąd podczas próby zapisania wpisu dotyczącego węglowodanów." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eroare la încercarea de salvare a carbohidraților." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Произошла ошибка при попытке сохранить запись об углеводах." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ett fel uppstod när du skulle spara dina kolhydrater." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karbonhidrat girişinizi kaydetmeye çalışırken bir hata oluştu." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存碳水记录时出错了。" + } + } + } + }, + "An error occurred while trying to save your manual glucose entry." : { + "comment" : "Alert message for a manual glucose entry persistence error", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der opstod en fejl under forsøget på at gemme en manuel blodsukkerindtastning." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beim Speichern Deines manuell eingegebenen Blutzuckers ist ein Fehler aufgetreten." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se produjo un error al intentar guardar la entrada manual de glucosa." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Virhe glukoosiarvon tallennuksessa." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une erreur est survenue lors de l'enregistrement de votre saisie manuelle de glycémie." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si è verificato un errore durante il tentativo di salvare l'inserimento manuale della glicemia." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det oppstod en feil under forsøk på å lagre den manuelle BS-registreringen." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er is een fout opgetreden tijdens het opslaan van je handmatige glucose-invoer." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wystąpił błąd podczas próby zapisania ręcznego wpisu o glukozie." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eroare la încercarea de salvare a glicemiei introduse manual." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Произошла ошибка при попытке сохранить данные о глюкозе, введенные вручную." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ett fel uppstod när du skulle spara ditt blodsockervärde." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manuel KŞ girişinizi kaydetmeye çalışırken bir hata oluştu." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在尝试保存您手动输入的血糖值时发生错误。" + } + } + } + }, + "An unexpected onboarding error state occurred." : { + "comment" : "Invalid onboarding state", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der er opstået en uventet fejltilstand i forbindelse med onboarding." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ein unerwarteter Fehlerstatus beim Onboarding ist aufgetreten." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se ha producido un error inesperado" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un état d'erreur innatendu a eu lieu durant le processus d'intégration" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si è verificato un errore di onboarding imprevisto." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En uventet onboarding-feiltilstand oppstod." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er is een onverwachte onboarding-foutstatus opgetreden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Niespodziewany błąd wdrażania" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "A apărut o eroare neașteptată de stare la inițiere." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Возникла непредвиденная ошибка подключения." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beklenmeyen bir ekleme hatası durumu oluştu." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "初始化向导发生意外错误状态" + } + } + } + }, + "An updated bolus recommendation is available." : { + "comment" : "Alert message when glucose data returns while on bolus screen", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En opdateret bolusanbefaling er tilgængelig." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eine aktualisierte Bolusempfehlung ist verfügbar." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hay una recomendación actualizada de bolo." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Päivitetty bolussuositus on saatavilla." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une recommandation de bolus mise à jour est disponible." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "È disponibile una raccomandazione aggiornata sul bolo." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En oppdatert bolusanbefaling er tilgjengelig." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Een bijgewerkte aanbevolen bolus is beschikbaar." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dostępna jest zaktualizowana rekomendacja bolusa." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Este disponibilă o recomandare de bolus nouă." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Доступна обновленная рекомендация болюса." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det finns nu en ny bolusrekommendation." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Güncellenmiş bir bolus önerisi mevcuttur." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "有新的大剂量推荐值可用" + } + } + } + }, + "API Key" : { + "comment" : "The title of the amplitude API key credential", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "API nøgle" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "API-avain" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clé API" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave API" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "API キー" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Nøkkel" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "API sleutel" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cheie API" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "API-ключ" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kľúč API" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Anahtarı" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Key" + } + } + } + }, + "API Secret" : { + "comment" : "The title of the nightscout API secret credential", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "API kodeord" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clave secreta API" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "API-salasana" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secret API" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiave personale API" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "APIシークレット" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Hemmelighet" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chave API" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Secretul API" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Секрет" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "API Secret" + } + } + } + }, + "App Profile" : { + "comment" : "Settings app profile section", + "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "App-profil" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "App-Profil" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Perfil de la aplicación" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil de l'application" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פרופיל אפליקציה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profilo app" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "App-profil" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "App-Profiel" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil aplikacji" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profilul aplicației" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Профиль приложения" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uygulama Profili" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "应用配置" + } + } + } + }, + "App Store" : { + "comment" : "Button title to open the App Store for a required update" + }, + "Apple" : { + "comment" : "Default name on add favorite food screen", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apfel" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pomme" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "תפוח" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mela" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eple" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appel" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "苹果" + } + } + } + }, + "Apple Health" : { + "comment" : "Apple Health settings button text\nTitle of the Apple Health access screen" + }, + "Are you sure you want to delete all history entries?" : { + "comment" : "Action sheet confirmation message for pump history deletion", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på at du vil slette alle gamle indtastninger?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Möchtest Du wirklich alle Verlaufseinträge löschen?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Estás seguro de querer eliminar todos las entradas históricas?" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haluatko varmasti poistaa kaikki historiatiedot?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voulez-vous vraiment supprimer toutes les entrées de l’historique?" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בטוח שברצונך למחוק את כל ערכי ההיסטוריה?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro di voler eliminare tutte le voci della cronologia?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "入力履歴をすべて削除しますか?" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på at du vil slette alle historieoppføringer?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weet je zeker dat je de gehele pompgeschiedenis wilt verwijderen?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czy jesteś pewien, że chcesz usunąć z Loop wszystkie dane historyczne pompy?" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tem certeza de que deseja excluir todas as entradas do histórico?" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sigur doriți să ștergeți toate înregistrările din istoric?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подтвердите удаление всех записей истории?" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Säkert att du vill radera all händelsehistorik?" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tüm geçmiş girişlerini silmek istediğinizden emin misiniz?" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn có chắc muốn xóa hết các dữ liệu cũ?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确定要删除所有历史记录吗?" + } + } + } + }, + "Are you sure you want to delete all logged dose entries?" : { + "comment" : "Action sheet confirmation message for logged dose deletion", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på, at du vil slette alle logget dosis?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Möchtest Du wirklich alle protokollierten Dosis Einträge löschen?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Estás seguro de que quieres borrar todas las entradas de dosis registradas?" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haluatko varmasti poistaa kaikki kirjatut annostelutiedot?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voulez-vous vraiment supprimer toutes les entrées de dose enregistrées?" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בטוח שברצונך למחוק את כל ערכי המנות?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro di voler eliminare tutte le dosi inserite?" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på at du vil slette alle loggførte doseoppføringer?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weet je zeker dat je de gehele doseringsgeschiedenis wilt verwijderen?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czy na pewno chcesz usunąć wszystkie zapisane wpisy dawek?" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sigur doriți să ștergeți toate înregistrările despre dozele de insulina?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы уверены, что хотите удалить все зарегистрированные записи о дозах?" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Är du säker på att du vill ta bort alla dina loggade doser?" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Günlüğe kaydedilen tüm doz girişlerini silmek istediğinizden emin misiniz?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "是否确定删除全部注射记录?" + } + } + } + }, + "Are you sure you want to delete all reservoir values?" : { + "comment" : "Action sheet confirmation message for reservoir deletion", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på at du vil slette alle reservoirværdier?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Möchtest Du wirklich alle Reservoirwerte löschen?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Estás seguro de querer eliminar todos los datos del reservorio?" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haluatko varmasti poistaa kaikki säiliön arvot?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voulez-vous vraiment supprimer toutes les valeurs de réservoir?" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בטוח שברצונך למחוק את כל ערכי המאגר?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro di voler eliminare tutti i valori del serbatoio?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "リザーバの値をすべて削除しますか?" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på at du vil slette alle reservoarverdier?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weet je zeker dat je alle waarden van het reservoir wilt verwijderen?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czy jesteś pewien, że chcesz usunąć wszystkie wartości zbiornika?" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tem certeza de que deseja excluir todos os valores do reservatório?" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sigur doriți să ștergeți toate valorile de rezervor?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подтвердите удаление всех записей резервуара?" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Säkert att du vill radera alla reservoarvärden?" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tüm rezervuar değerlerini silmek istediğinizden emin misiniz?" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn có chắc muốn xóa hết mọi giá trị của ngăn chứa insulin?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "是否确定删除全部储液量记录?" + } + } + } + }, + "Are you sure you want to delete all your %@ Data?\n(This action is not reversible)" : { + "comment" : "Confirmation before you delete all your Simulated Test Devices data", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på, at du vil slette alle dine %@ data?\n(Denne handling kan ikke fortrydes)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Möchtest Du wirklich alle %@-Daten löschen?\n(Diese Aktion kann nicht rückgängig gemacht werden)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Estás seguro de que quieres eliminar todos tus datos de %@ ?\n (Esta acción no es reversible)" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haluatko varmasti poistaa kaikki %@ tietosi?\n(Tämä toiminto ei ole palautettavissa)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voulez-vous vraiment effacer toutes vos valeurs de %@?\n(Cette action n'est pas réversible)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בטוח שברצונך למחוק את כל מידע %@?\n(פעולה זו בלתי הפיכה)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro di voler eliminare tutti i tuoi dati %@ ?\n (Questa azione non è reversibile)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på at du vil slette alle dine %@ Data?\n(Denne handlingen kan ikke angres)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weet je zeker dat je al je %@-gegevens wilt verwijderen?\n(Deze actie is niet omkeerbaar)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czy na pewno chcesz usunąć wszystkie swoje dane %@ ?\n (Ta czynność jest nieodwracalna)" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sunteți sigur că vreți să ștergeți toate datele %@.\n(Această acțiune nu este reversibilă)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы уверены, что хотите удалить все свои данные %@ ?\n (Это действие необратимо)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vill du ta bort alla dina %@data?\n(Denna åtgärd är inte reversibel)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tüm %@ Verilerinizi silmek istediğinizden emin misiniz?\n (Bu eylem geri alınamaz)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确定要删除所有 %@ 数据吗?(此操作无法恢复)" + } + } + } + }, + "Are you sure you want to delete all your testing Data?\n(This action is not reversible)" : { + "comment" : "The message displayed in an alert that lets the user delete all their testing data.", + "isCommentAutoGenerated" : true + }, + "Are you sure you want to delete this CGM?" : { + "comment" : "Confirmation message for deleting a CGM", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "هل أنت متأكد أنك تريد حذف هذا CGM؟" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på, at du vil slette denne CGM?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bist Du sicher, dass Du dieses CGM löschen möchtest?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Está seguro de que quiere eliminar este MCG?" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haluatko varmasti poistaa CGM:n?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voulez-vous vraiment supprimer ce CGM?" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בטוח שברצונך למחוק את חיישן זה?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro di voler eliminare questo CGM?" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "このCGMを削除しますか?" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på at du vil slette denne CGM?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weet je zeker dat je deze CGM wilt verwijderen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czy na pewno chcesz usunąć ten CGM?" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Você está certo que quer remover este CGM?" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sunteți sigur că vreți să ștergeți acest senzor de glicemie?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы уверены, что хотите удалить этот CGM?" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Naozaj chcete odstrániť toto CGM?" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Är du säker på att du vill radera denna CGM?" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bu CGM'i silmek istediğinizden emin misiniz?" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn có chắc sẽ xóa CGM này?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "确定要删除该CGM数据源?" + } + } + } + }, + "Are you sure you want to delete this food?" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på, at du vil slette denne mad?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bist Du sicher, dass Du diesen Favoriten löschen möchtest?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Êtes-vous sûr de vouloir supprimer cet aliment ?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro di voler eliminare questo cibo?" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på at du vil slette denne maten?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weet je zeker dat je dit voedingsmiddel wilt verwijderen?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czy na pewno chcesz usunąć to jedzenie?" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sunteți sigur că vreți să ștergeți acest aliment?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "你确定要删除该食物吗?" + } + } + } + }, + "Are you sure you want to delete this service?" : { + "comment" : "Confirmation message for deleting a service", + "extractionState" : "manual", + "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opravdu chcete tuto službu smazat?" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på, du vil slette denne service?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bist Du sicher, dass Du diesen Dienst löschen möchtest?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Está seguro de que desea eliminar este servicio?" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Haluatko varmasti poistaa tämän palvelun?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voulez-vous vraiment supprimer ce service?" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בטוח שברצונך למחוק את שירות זה?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sei sicuro di voler eliminare questo servizio?" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Er du sikker på at du vil slette denne tjenesten?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weet je zeker dat je deze service wil verwijderen?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czy na pewno chcesz usunąć tę usługę?" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sunteți sigur că vreți să ștergeți acest serviciu?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы уверены, что хотите удалить этот сервис?" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Naozaj chcete odstrániť túto službu?" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vill du ta bort den här tjänsten?" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bu servisi silmek istediğinizden emin misiniz?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "您确定要删除此服务吗?" + } + } + } + }, + "Are you sure you want to turn automation OFF?" : { + "comment" : "Closed loop alert title" + }, + "Arm test alert" : { + "comment" : "A button that arms a test alert for a glucose level below the normal range.", + "isCommentAutoGenerated" : true + }, + "Arming substitutes a below-threshold value in place of the next real CGM reading, so the alert fires from whatever app state Loop is in at that moment." : { + "comment" : "A footer text in the \"Arm test alert\" button's section, explaining how it works.", + "isCommentAutoGenerated" : true + }, + "ask yourself, am I more likely to go high or low during this event?" : { + + }, + "at %@" : { + "comment" : "Format fragment for a specific time", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "في %@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "at %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "um %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "en %@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "klo %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "à %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ב-%@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "a %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ 時点" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "kl %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "om %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "o %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "em %@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "la %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "В %@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "o %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "kl. %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "lúc %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@分钟内" + } + } + } + }, + "at %1$@" : { + "comment" : "when adding a timestamp. (1: the formatted timestamp)\nwhen adding the date and time. (1: the formatted date and time)" + }, + "At 100%%, %@ assumes your insulin needs are the same as usual." : { + + }, + "Authenticate to Bolus %@ Units" : { + "comment" : "The message displayed during a device authentication prompt for bolus specification", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المصادة على ضخ %@ وحدات" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Godkend bolus af %@ Enheder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusabgabe von %@ IE bestätigen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autenticar para Bolo %@ Unidades" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vahvista bolus %@ yksikköä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authentifiez-vous pour faire un bolus de %@ Unités" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticate to Bolus %@ Units" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esegui l'autenticazione per il bolo di %@ Unità" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ボーラス %@単位 認証してください" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentiserer for å gi %@ Enheter i Bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticeer om %@ E te bolussen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autoryzacja Bolusa %@ jednostek" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentique para Bolus de %@ Unidades" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentificare pentru bolusare %@ unități" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подтверждение болюса %@ ед" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potvrdiť pre Bolus %@ Jednotky" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Godkänn bolus på %@ enheter" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus için kimlik doğrula %@ Ünite" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xác thực liều Bolus %@ Units" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "解锁以输注大剂量 %@ 单位" + } + } + } + }, + "Authenticate to log %@ Units" : { + "comment" : "The message displayed during a device authentication prompt to log an insulin dose", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Godkend for at logge %@ enheder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authentifiziere Dich, um %@ Einheiten zu protokollieren." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autenticarse para registrar %@ Unidades" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vahvista kirjaus %@ yksikköä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authentifier pour enregistrer %@ unités" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esegui l'autenticazione per registrare %@ Unità" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentiser for å logge %@ Enheter" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticeer om %@ eenheden te registreren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autoryzuj, aby podać %@ Jednostki" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentificare pentru a înregistra %@ unități" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пройдите аутентификацию для подтверждения болюса %@ Единиц" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Godkänn att logga %@ enheter" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Ünite günlüğe kaydetmek için kimlik doğrulaması yapın" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请验证身份以记录 %@U 胰岛素" + } + } + } + }, + "Automated" : { + + }, + "Automated (↑ Increase)" : { + + }, + "Automated (↓ Decrease)" : { + + }, + "Automated (Preset Basal Rate)" : { + + }, + "Automated (Scheduled)" : { + + }, + "Automated insulin adjustments by %@ reduce a noticeable rise in glucose" : { + + }, + "Automation" : { + + }, + "Automation is off" : { + "comment" : "title for when automation is off" + }, + "Automation is on" : { + "comment" : "title for when automation is on" + }, + "Automation is unavailable" : { + "comment" : "title for when automation is unavailable" + }, + "Automation is unavailable while a manual temporary basal is in progress.\n\nCancel the manual temporary basal if you wish for the app to automate insulin delivery." : { + "comment" : "message when automation is on and a manual temp basal is in progress" + }, + "Automation is unavailable while your CGM sensor is warming up.\n\nIn the meantime, your pump is still able to deliver insulin.\n\nAutomation will resume when CGM readings are received." : { + "comment" : "message when automation is on and CGM is in warmup" + }, + "Automation is unavailable while your insulin is suspended.\n\nResume insulin if you wish for the app to automate insulin delivery." : { + "comment" : "message when automation is on and insulin delivery is suspended" + }, + "Automation OFF" : { + + }, + "Automation ON" : { + + }, + "Automation unavailable" : { + + }, + "Automation was unsuccessful" : { + "comment" : "title for when automation was unsuccessful" + }, + "Average" : { + "comment" : "Average glucose metric title", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المتوسط" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Průměr" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gennemsnit" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Durchschnitt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Promedio" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keskiarvo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moyenne" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ממוצע" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Átlag" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Media" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "平均" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gjennomsnitt" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gemiddeld" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Średnia" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Média" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medie" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Среднее" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Priemer" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medelvärde" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ortalama" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Середнє" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trung bình" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "平均值" + } + } + } + }, + "Average %1$@ U" : { + "comment" : "Trends Insulin per day legend: the dashed line showing average total insulin per day. (1: units)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المتوسط %1$@ وحدة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Průměr %1$@ U" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gennemsnit %1$@ E" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Durchschnitt %1$@ IE" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Promedio %1$@ U" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keskiarvo %1$@ U" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Moyenne %1$@ U" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ממוצע U %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Átlag %1$@ U" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Media %1$@ U" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "平均 %1$@ 単位" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gjennomsnitt %1$@ E" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gemiddeld %1$@ E" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Średnio %1$@ J" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Média %1$@ U" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medie %1$@ U" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Среднее %1$@ Ед." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Priemer %1$@ j" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medel %1$@ E" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ortalama %1$@ Ü" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Середнє %1$@ U" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trung bình %1$@ U" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "平均 %1$@ U" + } + } + } + }, + "Basal" : { + "comment" : "Chart callout label for the basal rate at the touched time Label of a tile showing the current basal rate (Now screen) or the day's basal insulin total (Today so far totals) Logbook filter chip: show only basal changes", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "القاعدية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazál" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaalinen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ベーサル" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaal" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podstawowy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazală" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazálna" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazal" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础" + } + } + } + }, + "Basal %1$@ U (%2$@%%)" : { + "comment" : "Trends Insulin per day legend: average basal insulin per day and its share of the total. (1: units, 2: percentage number)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "القاعدية %1$@ وحدة (%2$@%%)" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazál %1$@ U (%2$@%%)" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@ E (%2$@ %%)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@ IE (%2$@ %%)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@ U (%2$@%%)" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaali %1$@ U (%2$@ %%)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@ U (%2$@ %%)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal U %1$@ (%2$@%%)" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@ U (%2$@%%)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basale %1$@ U (%2$@%%)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ベーサル %1$@ 単位(%2$@%%)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@ E (%2$@ %%)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaal %1$@ E (%2$@%%)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baza %1$@ J (%2$@%%)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@ U (%2$@%%)" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazală %1$@ U (%2$@%%)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал %1$@ Ед. (%2$@%%)" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazál %1$@ j (%2$@%%)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@ E (%2$@ %%)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazal %1$@ Ü (%%%2$@)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал %1$@ U (%2$@%%)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal %1$@ U (%2$@%%)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础 %1$@ U(%2$@%%)" + } + } + } + }, + "Basal adjustments" : { + "comment" : "Logbook row title summarising the temp basals Loop set in a day Title of the list of every temp basal Loop set in a day", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعديلات القاعدية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Úpravy bazálu" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaljusteringer" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basalanpassungen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustes de basal" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaalisäädöt" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustements du basal" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "התאמות Basal" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal-módosítások" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Regolazioni basale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ベーサル調整" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaljusteringer" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaalaanpassingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zmiany bazy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustes de basal" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustări bazală" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Изменения базала" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Úpravy bazálu" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaljusteringar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazal ayarlamaları" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Зміни базалу" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Điều chỉnh Basal" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础率调整" + } + } + } + }, + "basal and bolus" : { + "comment" : "Trends Insulin per day card subtitle when each bar is one day's basal and bolus", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "القاعدية و Bolus" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "bazál a bolus" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "basal og bolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal und Bolus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "basal y bolo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "basaali ja bolus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "basal et bolus" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal ו-Bolus" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "basal és bólus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "basale e bolo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ベーサルとボーラス" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "basal og bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "basaal en bolus" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "baza i bolus" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "basal e bolus" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "bazală și bolus" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "базал и болюс" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "bazál a bolus" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "basal och bolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "bazal ve bolus" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "базал і болюс" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal và Bolus" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础和大剂量" + } + } + } + }, + "Basal given" : { + "comment" : "Chart legend: filled area is basal insulin actually delivered", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "القاعدية المُعطاة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podaný bazál" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Givet basal" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abgegebene Basalrate" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal administrada" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annettu basaali" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal administré" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal שניתן" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Leadott basal" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basale erogata" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "注入済みベーサル" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gitt basal" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toegediend basaal" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podana baza" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal entregue" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazală administrată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Поданный базал" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podaný bazál" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Given basal" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verilen bazal" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Поданий базал" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal đã tiêm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已输注基础" + } + } + } + }, + "Basal resumed" : { + "comment" : "Logbook row title: insulin delivery resumed after a suspend", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "استئناف القاعدية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazál obnoven" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal genoptaget" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal fortgesetzt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal reanudada" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaali jatkuu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal repris" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal חודש" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal folytatva" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basale ripresa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ベーサル再開" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal gjenopptatt" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaal hervat" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baza wznowiona" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal retomada" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazală reluată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал возобновлён" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazál obnovený" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal återupptagen" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazal devam ettirildi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал відновлено" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã tiếp tục Basal" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础已恢复" + } + } + } + }, + "Basal suspended" : { + "comment" : "Logbook row title: insulin delivery was suspended", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إيقاف القاعدية مؤقتًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazál pozastaven" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal suspenderet" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal unterbrochen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal suspendida" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaali pysäytetty" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal suspendu" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal הושהה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal felfüggesztve" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basale sospesa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ベーサル一時停止" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal stanset" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaal onderbroken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baza wstrzymana" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal suspensa" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazală suspendată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал приостановлен" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazál pozastavený" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal pausad" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazal askıya alındı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Базал призупинено" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã tạm ngưng Basal" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础已暂停" + } + } + } + }, + "Bolus %1$@ U (%2$@%%)" : { + "comment" : "Trends Insulin per day legend: average bolus insulin per day and its share of the total. (1: units, 2: percentage number)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ وحدة (%2$@%%)" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ U (%2$@%%)" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ E (%2$@ %%)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ IE (%2$@ %%)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo %1$@ U (%2$@%%)" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ U (%2$@ %%)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ U (%2$@ %%)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus U %1$@ (%2$@%%)" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bólus %1$@ U (%2$@%%)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo %1$@ U (%2$@%%)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ボーラス %1$@ 単位(%2$@%%)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ E (%2$@ %%)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ E (%2$@%%)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ J (%2$@%%)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ U (%2$@%%)" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ U (%2$@%%)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюс %1$@ Ед. (%2$@%%)" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ j (%2$@%%)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ E (%2$@ %%)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ Ü (%%%2$@)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюс %1$@ U (%2$@%%)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ U (%2$@%%)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大剂量 %1$@ U(%2$@%%)" + } + } + } + }, + "Boluses per day" : { + "comment" : "Trends summary tile: average number of manual boluses per day", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "جرعات Bolus يوميًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusů denně" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boluser pr. dag" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boli pro Tag" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolos por día" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boluksia päivässä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus par jour" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus ליום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bólusok naponta" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boli al giorno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "1日のボーラス回数" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boluser per dag" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolussen per dag" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusy dziennie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus por dia" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusuri pe zi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюсов в день" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusy za deň" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusar per dag" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Günlük bolus sayısı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюсів на день" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Số lần Bolus mỗi ngày" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每日大剂量次数" + } + } + } + }, + "Carbs" : { + "comment" : "Label of a tile showing the day's total carbohydrate Logbook filter chip: show only carb entries Logbook row title: a carb entry", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbs" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sacharidy" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidratos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiilihydraatit" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbs" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Szénhidrát" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carb." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "カーボ" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbs" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Углеводы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sacharidy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вуглеводи" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbs" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "碳水化合物" + } + } + } + }, + "Carbs per day" : { + "comment" : "Trends summary tile: average grams of carbohydrate entered per day", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الكارب يوميًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sacharidy denně" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kulhydrater pr. dag" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH pro Tag" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidratos por día" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiilihydraatit päivässä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucides par jour" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פחמימות ליום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Szénhidrát naponta" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidrati al giorno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "1日のカーボ" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karbohydrater per dag" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraten per dag" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Węglowodany dziennie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbs por dia" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidrați pe zi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Углеводов в день" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sacharidy za deň" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kolhydrater per dag" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Günlük karb" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вуглеводів на день" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbs mỗi ngày" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每日碳水" + } + } + } + }, + "Changes with the home screen's light or dark appearance" : { + "comment" : "Description of the app icon that follows the home screen appearance", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تتغير مع المظهر الفاتح أو الداكن للشاشة الرئيسية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mění se podle světlého nebo tmavého vzhledu plochy" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skifter med hjemmeskærmens lyse eller mørke udseende" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wechselt mit der hellen oder dunklen Darstellung des Home-Bildschirms" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cambia con la apariencia clara u oscura de la pantalla de inicio" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vaihtuu kotinäytön vaalean tai tumman ulkoasun mukaan" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suit l'apparence claire ou sombre de l'écran d'accueil" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משתנה בהתאם למראה הבהיר או הכהה של מסך הבית" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A kezdőképernyő világos vagy sötét megjelenését követi" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cambia con l'aspetto chiaro o scuro della schermata Home" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ホーム画面のライト/ダークに合わせて変わります" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Endres med det lyse eller mørke utseendet på Hjem-skjermen" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Past zich aan de lichte of donkere weergave van het beginscherm aan" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zmienia się wraz z jasnym lub ciemnym wyglądem ekranu początkowego" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Muda com a aparência clara ou escura da tela de início" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se schimbă după aspectul luminos sau întunecat al ecranului principal" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Меняется вместе со светлым или тёмным оформлением экрана «Домой»" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mení sa podľa svetlého alebo tmavého vzhľadu plochy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Följer hemskärmens ljusa eller mörka utseende" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ana ekranın açık veya koyu görünümüne göre değişir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Змінюється разом зі світлим або темним виглядом початкового екрана" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thay đổi theo giao diện sáng hoặc tối của màn hình chính" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "随主屏幕的浅色或深色外观变化" + } + } + } + }, + "Classic" : { + "comment" : "Name of Loop's original app icon", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "كلاسيكي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klasická" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klassisk" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klassisch" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clásico" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klassinen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Classique" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קלאסי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klasszikus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Classica" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クラシック" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klassisk" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klassiek" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klasyczna" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clássico" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Clasică" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Классический" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klasická" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klassisk" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klasik" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Класична" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cổ điển" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "经典" + } + } + } + }, + "Closed loop" : { + "comment" : "Trends Loop status: time Loop was running in closed loop", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حلقة مغلقة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavřená smyčka" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circuito cerrado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle fermée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zárt hurok" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クローズドループ" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla zamknięta" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo fechado" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavretá slučka" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten loop" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı döngü" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутий цикл" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp kín" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环" + } + } + } + }, + "Closed loop off" : { + "comment" : "Reason shown for a stretch of time when Loop was in open loop because closed loop was turned off", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الحلقة المغلقة متوقفة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavřená smyčka vypnuta" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop slået fra" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop aus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circuito cerrado desactivado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö pois" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle fermée désactivée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop כבוי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zárt hurok kikapcsolva" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso disattivato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クローズドループ オフ" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop av" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop uit" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla zamknięta wyłączona" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo fechado desligado" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă oprită" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл выключен" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavretá slučka vypnutá" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten loop av" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı döngü kapalı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутий цикл вимкнено" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp kín tắt" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环已关闭" + } + } + } + }, + "Closed loop paused · %1$@" : { + "comment" : "Status pill on the Now screen: closed loop is switched on but paused (e.g. no CGM data), and Loop last ran this long ago. (1: duration, e.g. 3m)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الحلقة المغلقة متوقفة مؤقتًا · %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavřená smyčka pozastavena · %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop sat på pause · %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop pausiert · %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circuito cerrado en pausa · %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö tauolla · %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle fermée en pause · %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop מושהה · %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zárt hurok szüneteltetve · %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso in pausa · %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クローズドループ一時停止中 · %1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop satt på pause · %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop gepauzeerd · %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla zamknięta wstrzymana · %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo fechado pausado · %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă în pauză · %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл на паузе · %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavretá slučka pozastavená · %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten loop pausad · %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı döngü duraklatıldı · %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутий цикл на паузі · %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp kín tạm dừng · %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环已暂停 · %1$@" + } + } + } + }, + "Closed loop paused · not run yet" : { + "comment" : "Status pill on the Now screen: closed loop is switched on but paused (e.g. no CGM data), and Loop has never completed", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الحلقة المغلقة متوقفة مؤقتًا · لم يعمل بعد" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavřená smyčka pozastavena · zatím neproběhla" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop sat på pause · ikke kørt endnu" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop pausiert · noch nicht gelaufen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circuito cerrado en pausa · aún no se ha ejecutado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö tauolla · ei vielä ajettu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle fermée en pause · pas encore exécuté" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop מושהה · טרם רץ" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zárt hurok szüneteltetve · még nem futott" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso in pausa · non ancora eseguito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クローズドループ一時停止中 · 未実行" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop satt på pause · ikke kjørt ennå" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop gepauzeerd · nog niet gedraaid" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla zamknięta wstrzymana · jeszcze nie działała" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo fechado pausado · ainda não executou" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă în pauză · nu a rulat încă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл на паузе · ещё не запускался" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavretá slučka pozastavená · ešte neprebehla" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten loop pausad · inte körd än" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı döngü duraklatıldı · henüz çalışmadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутий цикл на паузі · ще не запускався" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp kín tạm dừng · chưa chạy" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环已暂停 · 尚未运行" + } + } + } + }, + "Closed loop · %1$@" : { + "comment" : "Status pill on the Now screen: closed loop is on and Loop last ran this long ago. (1: duration, e.g. 3m)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حلقة مغلقة · %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavřená smyčka · %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop · %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop · %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circuito cerrado · %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö · %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle fermée · %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop · %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zárt hurok · %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso · %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クローズドループ · %1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop · %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop · %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla zamknięta · %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo fechado · %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă · %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл · %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavretá slučka · %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten loop · %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı döngü · %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутий цикл · %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp kín · %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环 · %1$@" + } + } + } + }, + "Closed loop · not run yet" : { + "comment" : "Status pill on the Now screen: closed loop is on but Loop has never completed", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حلقة مغلقة · لم يعمل بعد" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavřená smyčka · zatím neproběhla" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop · ikke kørt endnu" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop · noch nicht gelaufen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circuito cerrado · aún no se ha ejecutado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö · ei vielä ajettu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle fermée · pas encore exécuté" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop · טרם רץ" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zárt hurok · még nem futott" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso · non ancora eseguito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クローズドループ · 未実行" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop · ikke kjørt ennå" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop · nog niet gedraaid" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla zamknięta · jeszcze nie działała" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo fechado · ainda não executou" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă · nu a rulat încă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл · ещё не запускался" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uzavretá slučka · ešte neprebehla" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten loop · inte körd än" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı döngü · henüz çalışmadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутий цикл · ще не запускався" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp kín · chưa chạy" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环 · 尚未运行" + } + } + } + }, + "COB" : { + "comment" : "Abbreviation for carbs on board (active carbohydrate) Abbreviation for carbs on board; label of a tile on the Now screen", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "GA" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB" + } + } + } + }, + "COB (g, right)" : { + "comment" : "Chart legend: carbs on board in grams, on the right axis", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g، يمين)" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, vpravo)" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, højre)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, rechts)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, derecha)" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, oikea)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "GA (g, droite)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, ימין)" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, jobb)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, destra)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB(g、右)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, høyre)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, rechts)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, prawa oś)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, direita)" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, dreapta)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (г, справа)" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, vpravo)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, höger)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (gr, sağ)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (г, праворуч)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB (g, bên phải)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "COB(克,右轴)" + } + } + } + }, + "Configuration error" : { + "comment" : "Reason Loop could not run: its settings are incomplete", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "خطأ في الإعدادات" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba konfigurace" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurationsfejl" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurationsfehler" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error de configuración" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Määritysvirhe" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erreur de configuration" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שגיאת תצורה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurációs hiba" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errore di configurazione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定エラー" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurasjonsfeil" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuratiefout" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Błąd konfiguracji" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erro de configuração" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eroare de configurare" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ошибка настроек" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba konfigurácie" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurationsfel" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yapılandırma hatası" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Помилка налаштувань" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lỗi cấu hình" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置错误" + } + } + } + }, + "Connection error" : { + "comment" : "Reason Loop could not run: no connected devices, or a device connection failed", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "خطأ في الاتصال" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba připojení" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forbindelsesfejl" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verbindungsfehler" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error de conexión" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yhteysvirhe" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erreur de connexion" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שגיאת חיבור" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapcsolódási hiba" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errore di connessione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "接続エラー" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilkoblingsfeil" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verbindingsfout" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Błąd połączenia" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erro de conexão" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eroare de conexiune" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ошибка подключения" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba pripojenia" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anslutningsfel" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bağlantı hatası" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Помилка підключення" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lỗi kết nối" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连接错误" + } + } + } + }, + "Couldn't delete" : { + "comment" : "Alert title when deleting a Logbook entry fails", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعذّر الحذف" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nelze smazat" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke slette" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Löschen fehlgeschlagen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No se pudo eliminar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poisto epäonnistui" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suppression impossible" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא ניתן היה למחוק" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nem sikerült törölni" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile eliminare" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "削除できませんでした" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke slette" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwijderen mislukt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie udało się usunąć" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível apagar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nu s-a putut șterge" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось удалить" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nedá sa odstrániť" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunde inte ta bort" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Silinemedi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не вдалося видалити" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không thể xóa" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法删除" + } + } + } + }, + "Couldn't export" : { + "comment" : "Alert title when exporting the Trends PDF or CSV fails", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعذّر التصدير" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nelze exportovat" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke eksportere" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Export fehlgeschlagen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No se pudo exportar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vienti epäonnistui" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportation impossible" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא ניתן היה לייצא" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nem sikerült exportálni" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile esportare" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "書き出せませんでした" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke eksportere" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporteren mislukt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie udało się wyeksportować" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível exportar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nu s-a putut exporta" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось экспортировать" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nedá sa exportovať" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunde inte exportera" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dışa aktarılamadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не вдалося експортувати" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không thể xuất" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法导出" + } + } + } + }, + "Couldn't load Logbook: %1$@" : { + "comment" : "Logbook error when its history can't be read. (1: system error description)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعذّر تحميل السجل: %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nelze načíst deník: %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke indlæse logbogen: %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Logbuch konnte nicht geladen werden: %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No se pudo cargar el registro: %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lokikirjaa ei voitu ladata: %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossible de charger le journal : %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא ניתן היה לטעון את היומן: %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nem sikerült betölteni a naplót: %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile caricare il diario: %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ログブックを読み込めませんでした:%1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke laste inn loggboken: %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Logboek kan niet worden geladen: %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie udało się wczytać dziennika: %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível carregar o diário: %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nu s-a putut încărca jurnalul: %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось загрузить журнал: %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denník sa nedá načítať: %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunde inte läsa in loggboken: %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kayıt Defteri yüklenemedi: %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не вдалося завантажити журнал: %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không thể tải Nhật ký: %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法载入日志:%1$@" + } + } + } + }, + "Couldn't load recent CGM readings" : { + "comment" : "Prediction chart on the Now screen when recent glucose couldn't be read", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعذّر تحميل قراءات CGM الأخيرة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nelze načíst nedávné hodnoty CGM" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke indlæse de seneste CGM-målinger" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktuelle CGM-Werte konnten nicht geladen werden" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No se pudieron cargar las lecturas recientes del CGM" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Viimeisimpiä CGM-lukemia ei voitu ladata" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossible de charger les mesures CGM récentes" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא ניתן היה לטעון קריאות CGM אחרונות" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nem sikerült betölteni a legutóbbi CGM-értékeket" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile caricare le letture CGM recenti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "最近のCGM値を読み込めませんでした" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke laste inn nylige CGM-målinger" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recente CGM-waarden kunnen niet worden geladen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie udało się wczytać ostatnich odczytów CGM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível carregar as leituras recentes do CGM" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nu s-au putut încărca citirile CGM recente" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось загрузить последние показания CGM" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nedajú sa načítať nedávne hodnoty CGM" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunde inte läsa in senaste CGM-värden" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Son CGM okumaları yüklenemedi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не вдалося завантажити останні показники CGM" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không thể tải các chỉ số CGM gần đây" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法载入最近的 CGM 读数" + } + } + } + }, + "Couldn't load this day: %1$@" : { + "comment" : "Day page error when the day's history can't be read. (1: system error description)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعذّر تحميل هذا اليوم: %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nelze načíst tento den: %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke indlæse denne dag: %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dieser Tag konnte nicht geladen werden: %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No se pudo cargar este día: %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Päivää ei voitu ladata: %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossible de charger cette journée : %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא ניתן היה לטעון יום זה: %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nem sikerült betölteni ezt a napot: %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile caricare questo giorno: %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "この日を読み込めませんでした:%1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke laste inn denne dagen: %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deze dag kan niet worden geladen: %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie udało się wczytać tego dnia: %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível carregar este dia: %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nu s-a putut încărca această zi: %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось загрузить этот день: %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tento deň sa nedá načítať: %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunde inte läsa in dagen: %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bu gün yüklenemedi: %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не вдалося завантажити цей день: %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không thể tải ngày này: %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法载入这一天:%1$@" + } + } + } + }, + "Couldn't load today's history: %1$@" : { + "comment" : "Shown on the Now screen's Today so far card when history couldn't be read. (1: system error description)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعذّر تحميل سجل اليوم: %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nelze načíst dnešní historii: %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke indlæse dagens historik: %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der heutige Verlauf konnte nicht geladen werden: %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No se pudo cargar el historial de hoy: %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tämän päivän historiaa ei voitu ladata: %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossible de charger l'historique du jour : %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא ניתן היה לטעון את היסטוריית היום: %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nem sikerült betölteni a mai előzményeket: %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile caricare la cronologia di oggi: %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "今日の履歴を読み込めませんでした:%1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke laste inn dagens historikk: %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "De geschiedenis van vandaag kan niet worden geladen: %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie udało się wczytać dzisiejszej historii: %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível carregar o histórico de hoje: %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nu s-a putut încărca istoricul de azi: %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось загрузить историю за сегодня: %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dnešná história sa nedá načítať: %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunde inte läsa in dagens historik: %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bugünün geçmişi yüklenemedi: %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не вдалося завантажити історію за сьогодні: %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không thể tải lịch sử hôm nay: %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法载入今天的历史记录:%1$@" + } + } + } + }, + "Couldn't load Trends: %1$@" : { + "comment" : "Trends error message when the history can't be read. (1: error description)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعذّر تحميل الاتجاهات: %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nelze načíst trendy: %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke indlæse Tendenser: %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trends konnten nicht geladen werden: %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No se pudieron cargar las tendencias: %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trendejä ei voitu ladata: %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossible de charger les tendances : %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא ניתן היה לטעון מגמות: %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nem sikerült betölteni a trendeket: %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile caricare le tendenze: %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "トレンドを読み込めませんでした:%1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke laste inn Trender: %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trends kunnen niet worden geladen: %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie udało się wczytać trendów: %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível carregar as tendências: %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nu s-au putut încărca tendințele: %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось загрузить тренды: %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trendy sa nedajú načítať: %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunde inte läsa in Trender: %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eğilimler yüklenemedi: %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не вдалося завантажити тренди: %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không thể tải Xu hướng: %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法载入趋势:%1$@" + } + } + } + }, + "Covers %1$@: Loop keeps 7 days of runs, and closed or open loop is recorded from when the new interface was first opened." : { + "comment" : "Trends Loop status footnote when the status covers only part of the period. (1: date range covered)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يغطي %1$@: يحتفظ Loop بسجل تشغيلات 7 أيام، وتُسجَّل الحلقة المغلقة أو المفتوحة منذ أول فتح للواجهة الجديدة." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pokrývá %1$@: Loop uchovává běhy za 7 dní a uzavřená či otevřená smyčka se zaznamenává od prvního otevření nového rozhraní." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dækker %1$@: Loop gemmer kørsler i 7 dage, og lukket eller åbent Loop registreres fra første gang den nye brugerflade blev åbnet." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Umfasst %1$@: Loop speichert Durchläufe 7 Tage lang, und Closed oder Open Loop wird erst ab dem ersten Öffnen der neuen Oberfläche aufgezeichnet." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cubre %1$@: Loop guarda 7 días de ejecuciones, y el circuito cerrado o abierto se registra desde la primera vez que se abrió la nueva interfaz." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kattaa %1$@: Loop säilyttää 7 päivän ajot, ja suljettu tai avoin säätö tallennetaan siitä lähtien, kun uusi käyttöliittymä avattiin ensimmäisen kerran." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Couvre %1$@ : Loop conserve 7 jours d'exécutions, et la boucle fermée ou ouverte est enregistrée depuis la première ouverture de la nouvelle interface." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מכסה %1$@: Loop שומר 7 ימים של הרצות, ו-Closed Loop או Open Loop נרשמים מאז הפתיחה הראשונה של הממשק החדש." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lefedett időszak: %1$@. A Loop 7 napnyi futást őriz meg, a zárt vagy nyitott hurok pedig az új felület első megnyitásától kerül rögzítésre." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copre %1$@: Loop conserva 7 giorni di esecuzioni e il loop chiuso o aperto è registrato dalla prima apertura della nuova interfaccia." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "対象期間 %1$@:Loopは実行記録を7日間保持し、クローズド/オープンループは新しいインターフェイスを初めて開いた時点から記録されます。" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dekker %1$@: Loop lagrer kjøringer i 7 dager, og lukket eller åpen Loop registreres fra første gang det nye grensesnittet ble åpnet." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Omvat %1$@: Loop bewaart 7 dagen aan loop-runs, en actieve of open loop wordt vastgelegd vanaf het moment dat de nieuwe interface voor het eerst werd geopend." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obejmuje %1$@: Loop przechowuje cykle z 7 dni, a pętla zamknięta lub otwarta jest zapisywana od pierwszego otwarcia nowego interfejsu." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cobre %1$@: o Loop guarda 7 dias de execuções, e o ciclo fechado ou aberto é registrado desde a primeira vez que a nova interface foi aberta." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acoperă %1$@: Loop păstrează 7 zile de rulări, iar bucla închisă sau deschisă este înregistrată de la prima deschidere a noii interfețe." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Охвачено: %1$@. Loop хранит запуски за 7 дней, а замкнутый или открытый цикл записывается с первого открытия нового интерфейса." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pokrýva %1$@: Loop uchováva behy za 7 dní a uzavretá či otvorená slučka sa zaznamenáva od prvého otvorenia nového rozhrania." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Omfattar %1$@: Loop sparar 7 dagars körningar, och sluten eller öppen loop registreras från när det nya gränssnittet först öppnades." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapsanan dönem %1$@: Loop 7 günlük çalışma kaydı tutar; kapalı veya açık döngü, yeni arayüzün ilk açıldığı andan itibaren kaydedilir." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Охоплено: %1$@. Loop зберігає запуски за 7 днів, а замкнутий чи відкритий цикл записується з першого відкриття нового інтерфейсу." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bao gồm %1$@: Loop lưu các lần chạy trong 7 ngày, và trạng thái vòng lặp kín hoặc mở được ghi lại từ khi giao diện mới được mở lần đầu." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "覆盖 %1$@:Loop 保留 7 天的运行记录,闭环或开环状态从首次打开新界面时开始记录。" + } + } + } + }, + "CSV, one row per day" : { + "comment" : "Trends export menu item: share a CSV spreadsheet file with one row for each day", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV، صف واحد لكل يوم" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, jeden řádek na den" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, én række pr. dag" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, eine Zeile pro Tag" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, una fila por día" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, yksi rivi päivää kohden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, une ligne par jour" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, שורה אחת לכל יום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, naponta egy sor" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, una riga al giorno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV(1日1行)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, én rad per dag" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, één rij per dag" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, jeden wiersz na dzień" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, uma linha por dia" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, un rând pe zi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, одна строка на день" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, jeden riadok na deň" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, en rad per dag" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, gün başına bir satır" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, один рядок на день" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV, mỗi ngày một dòng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "CSV,每天一行" + } + } + } + }, + "Daily pattern" : { + "comment" : "Trends card title: the ambulatory glucose profile, glucose by time of day across the period", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "النمط اليومي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denní profil" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Døgnmønster" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tagesprofil" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Patrón diario" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuorokausiprofiili" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil journalier" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "דפוס יומי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Napi mintázat" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Andamento giornaliero" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日内パターン" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Døgnmønster" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dagpatroon" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil dobowy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Padrão diário" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipar zilnic" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Суточный профиль" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denný profil" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dygnsmönster" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Günlük örüntü" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добовий профіль" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mẫu hằng ngày" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每日模式" + } + } + } + }, + "Daily pattern over %1$@. Median highest %2$@ at %3$@, lowest %4$@ at %5$@" : { + "comment" : "VoiceOver label for the Trends Daily pattern chart. (1: days with readings, e.g. 14 days; 2: highest median glucose; 3: time of day; 4: lowest median glucose; 5: time of day)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "النمط اليومي خلال %1$@. أعلى وسيط %2$@ عند %3$@، وأدنى وسيط %4$@ عند %5$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denní profil za %1$@. Nejvyšší medián %2$@ v %3$@, nejnižší %4$@ v %5$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Døgnmønster over %1$@. Median højest %2$@ kl. %3$@, lavest %4$@ kl. %5$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tagesprofil über %1$@. Median am höchsten %2$@ um %3$@, am niedrigsten %4$@ um %5$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Patrón diario de %1$@. Mediana más alta %2$@ a las %3$@, más baja %4$@ a las %5$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuorokausiprofiili %1$@ ajalta. Korkein mediaani %2$@ klo %3$@, matalin %4$@ klo %5$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil journalier sur %1$@. Médiane la plus haute %2$@ à %3$@, la plus basse %4$@ à %5$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "דפוס יומי במשך %1$@. חציון גבוה ביותר %2$@ ב-%3$@, נמוך ביותר %4$@ ב-%5$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Napi mintázat, %1$@. Legmagasabb medián %2$@ ekkor: %3$@, legalacsonyabb %4$@ ekkor: %5$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Andamento giornaliero su %1$@. Mediana più alta %2$@ alle %3$@, più bassa %4$@ alle %5$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@の日内パターン。中央値の最高は%3$@の%2$@、最低は%5$@の%4$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Døgnmønster over %1$@. Median høyest %2$@ kl. %3$@, lavest %4$@ kl. %5$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dagpatroon over %1$@. Mediaan hoogst %2$@ om %3$@, laagst %4$@ om %5$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil dobowy z %1$@. Najwyższa mediana %2$@ o %3$@, najniższa %4$@ o %5$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Padrão diário em %1$@. Mediana mais alta %2$@ às %3$@, mais baixa %4$@ às %5$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipar zilnic pe %1$@. Mediana cea mai mare %2$@ la %3$@, cea mai mică %4$@ la %5$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Суточный профиль за %1$@. Наибольшая медиана %2$@ в %3$@, наименьшая %4$@ в %5$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denný profil za %1$@. Najvyšší medián %2$@ o %3$@, najnižší %4$@ o %5$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dygnsmönster över %1$@. Högsta median %2$@ kl. %3$@, lägsta %4$@ kl. %5$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ boyunca günlük örüntü. En yüksek medyan %3$@ saatinde %2$@, en düşük %5$@ saatinde %4$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добовий профіль за %1$@. Найвища медіана %2$@ о %3$@, найнижча %4$@ о %5$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mẫu hằng ngày trong %1$@. Trung vị cao nhất %2$@ lúc %3$@, thấp nhất %4$@ lúc %5$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@的每日模式。中位数最高 %2$@(%3$@),最低 %4$@(%5$@)" + } + } + } + }, + "Daily pattern: not enough days" : { + "comment" : "VoiceOver label for the Trends Daily pattern chart when fewer than 5 days have readings", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "النمط اليومي: لا توجد أيام كافية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denní profil: málo dní" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Døgnmønster: ikke nok dage" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tagesprofil: nicht genug Tage" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Patrón diario: no hay suficientes días" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuorokausiprofiili: liian vähän päiviä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil journalier : pas assez de jours" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "דפוס יומי: אין מספיק ימים" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Napi mintázat: nincs elég nap" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Andamento giornaliero: giorni insufficienti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日内パターン:日数が不足しています" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Døgnmønster: ikke nok dager" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dagpatroon: niet genoeg dagen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Profil dobowy: za mało dni" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Padrão diário: dias insuficientes" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipar zilnic: prea puține zile" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Суточный профиль: недостаточно дней" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denný profil: málo dní" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dygnsmönster: för få dagar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Günlük örüntü: yeterli gün yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добовий профіль: замало днів" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mẫu hằng ngày: không đủ số ngày" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "每日模式:天数不足" + } + } + } + }, + "Day" : { + "comment" : "Appearance option and app icon name: the light (daytime) version", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نهار" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Den" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tag" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Día" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Päivä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jour" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "יום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nap" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giorno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dzień" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dia" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "День" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deň" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gündüz" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "День" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ngày" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "日" + } + } + } + }, + "Day (Trends period)" : { + "comment" : "Trends period picker: a period of one calendar day (not daytime)", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Day" + } + }, + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يوم" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Den" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tag" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Día" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Päivä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jour" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "יום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nap" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giorno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dzień" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dia" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "День" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deň" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gün" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "День" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ngày" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "日" + } + } + } + }, + "Day and Night" : { + "comment" : "Name of the app icon that follows the home screen's light or dark appearance", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نهار وليل" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Den a noc" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag og nat" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tag und Nacht" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Día y noche" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Päivä ja yö" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jour et nuit" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "יום ולילה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nap és éjszaka" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giorno e notte" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日と夜" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag og natt" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag en nacht" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dzień i noc" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dia e noite" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zi și noapte" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "День и ночь" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deň a noc" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dag och natt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gündüz ve Gece" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "День і ніч" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ngày và Đêm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "日与夜" + } + } + } + }, + "Eaten at %1$@, absorbed by %2$@" : { + "comment" : "Accessibility summary of the carb entry preview chart (1: time eaten, 2: time absorbed)" + }, + "Edit" : { + "comment" : "Swipe action to edit a Logbook carb entry", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعديل" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Upravit" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rediger" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bearbeiten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Editar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Muokkaa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modifier" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ערוך" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Szerkesztés" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modifica" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "編集" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rediger" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wijzig" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Edytuj" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Editar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Editați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Изменить" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Upraviť" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redigera" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Düzenle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Змінити" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sửa" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑" + } + } + } + }, + "Edit Carb Entry" : { + "comment" : "Title of the screen for editing a carb entry from the Logbook", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعديل إدخال الكارب" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Upravit záznam sacharidů" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rediger kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH-Eintrag bearbeiten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Editar entrada de carbohidratos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Muokkaa hiilihydraatteja" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modifier les glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "עריכת פחמימות" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Szénhidrát szerkesztése" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modifica carboidrati inseriti" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "糖質の記入を編集" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rediger karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraatinvoer wijzigen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Edytuj wprowadzone węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Editar carbs" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Editați intrarea de carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Редактировать запись углеводов" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Upraviť záznam sacharidov" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Redigera kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb Girişini Düzenle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Редагувати запис вуглеводів" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sửa khai báo Carb" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "编辑碳水记录" + } + } + } + }, + "Eventually %1$@ %2$@" : { + "comment" : "Prediction card on the Now screen: Loop's eventual predicted glucose. (1: glucose value; 2: glucose unit, e.g. mmol/L)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "في النهاية %1$@ %2$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nakonec %1$@ %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Med tiden %1$@ %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voraussichtlich %1$@ %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Al final %1$@ %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ennuste %1$@ %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finalement %1$@ %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventually %1$@ %2$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Várható %1$@ %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infine %1$@ %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "予想 %1$@ %2$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Omsider %1$@ %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uiteindelijk %1$@ %2$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Docelowo %1$@ %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "No final %1$@ %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "În cele din urmă %1$@ %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "В конечном итоге %1$@ %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nakoniec %1$@ %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Förväntat %1$@ %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nihai KŞ %1$@ %2$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Зрештою %1$@ %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kết quả %1$@ %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最终 %1$@ %2$@" + } + } + } + }, + "Export" : { + "comment" : "Trends menu title: export the period as a PDF report or CSV file", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تصدير" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportovat" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportieren" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vie" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporter" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ייצוא" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportálás" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esporta" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "書き出し" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporter" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporteer" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksportuj" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Экспорт" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportovať" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportera" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dışa Aktar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Експорт" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xuất" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导出" + } + } + } + }, + "From Apple Health: Loop keeps 7 days, so this day has no temp basal or schedule detail." : { + "comment" : "Day page note when the day is older than Loop's 7-day history and was read from Apple Health", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "من Apple Health: يحتفظ Loop بـ 7 أيام فقط، لذا لا توجد تفاصيل Temp Basal أو الجدول لهذا اليوم." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Z aplikace Zdraví: Loop uchovává 7 dní, takže pro tento den chybí podrobnosti o dočasném bazálu a plánu." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fra Apple Sundhed: Loop gemmer 7 dage, så denne dag har ingen detaljer om midlertidig basal eller tidsplan." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aus Apple Health: Loop speichert 7 Tage, daher gibt es für diesen Tag keine Details zu temporären Basalraten oder zum Zeitplan." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "De Apple Salud: Loop guarda 7 días, así que este día no tiene detalle de basal temporal ni de programación." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple Terveydestä: Loop säilyttää 7 päivää, joten tältä päivältä ei ole tilapäisen basaalin tai ohjelman tietoja." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Depuis Apple Santé : Loop conserve 7 jours, donc ce jour n'a pas de détail de basal temp. ni de programmation." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מ-Apple Health: Loop שומר 7 ימים, ולכן אין ליום זה פרטי Temp Basal או תוכנית." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Az Apple Egészség appból: a Loop 7 napot őriz meg, így ehhez a naphoz nincsenek ideiglenes basal- és ütemezési részletek." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Da Apple Salute: Loop conserva 7 giorni, quindi questo giorno non ha dettagli su basale temporanea o programmazione." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Appleヘルスケアから取得:Loopは7日間のみ保持するため、この日には一時ベーサルやスケジュールの詳細がありません。" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fra Apple Helse: Loop lagrer 7 dager, så denne dagen har ingen detaljer om midlertidig basal eller tidsplan." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uit Apple Health: Loop bewaart 7 dagen, dus deze dag heeft geen details over tijdelijk basaal of het schema." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Z aplikacji Zdrowie: Loop przechowuje 7 dni, więc dla tego dnia brak szczegółów bazy tymczasowej i harmonogramu." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Do app Saúde: o Loop guarda 7 dias, então este dia não tem detalhes de basal temporária nem da programação." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Din Apple Sănătate: Loop păstrează 7 zile, așa că această zi nu are detalii despre bazala temporară sau program." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Из приложения «Здоровье»: Loop хранит 7 дней, поэтому для этого дня нет данных о временном базале и расписании." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Z aplikácie Zdravie: Loop uchováva 7 dní, preto pre tento deň chýbajú podrobnosti o dočasnom bazáli a pláne." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Från Apple Hälsa: Loop sparar 7 dagar, så den här dagen saknar detaljer om temporär basal och schema." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple Health'ten: Loop 7 gün saklar, bu nedenle bu gün için geçici bazal veya program ayrıntısı yok." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "З програми «Здоровʼя»: Loop зберігає 7 днів, тому для цього дня немає даних про тимчасовий базал і розклад." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Từ Apple Health: Loop chỉ lưu 7 ngày, nên ngày này không có chi tiết Temp Basal hoặc lịch biểu." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "来自 Apple 健康:Loop 只保留 7 天,因此这一天没有临时基础率或预设详情。" + } + } + } + }, + "Gaps" : { + "comment" : "Trends Loop status button and screen title: list of times Loop wasn't in closed loop", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الفجوات" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Výpadky" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Huller" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lücken" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Interrupciones" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Katkot" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Interruptions" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פערים" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kimaradások" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Interruzioni" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "中断" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hull" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Onderbrekingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przerwy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Interrupções" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Întreruperi" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пропуски" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Výpadky" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Luckor" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boşluklar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пропуски" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gián đoạn" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "中断" + } + } + } + }, + "glucose %1$@" : { + "comment" : "Logbook row detail: glucose when the dose was given. (1: glucose value, e.g. 7.5)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "السكر %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukóza %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukose %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blutzucker %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "glucosa %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukoosi %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "glycémie %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "סוכר %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "glükóz %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "glicemia %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖値 %1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "blodsukker %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "glucose %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukoza %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "glicose %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "glicemie %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "глюкоза %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "glykémia %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukos %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "KŞ %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "глюкоза %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "đường huyết %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖 %1$@" + } + } + } + }, + "glucose %1$@ falling" : { + "comment" : "Logbook row detail: glucose when the dose was given, and falling. (1: glucose value, e.g. 11.0)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "السكر %1$@ ينخفض" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukóza %1$@, klesá" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukose %1$@ faldende" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blutzucker %1$@ fallend" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "glucosa %1$@ bajando" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukoosi %1$@ laskeva" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "glycémie %1$@ en baisse" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "סוכר %1$@ יורד" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "glükóz %1$@, csökkenő" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "glicemia %1$@ in discesa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖値 %1$@ 下降中" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "blodsukker %1$@ fallende" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "glucose %1$@ dalend" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukoza %1$@, spada" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "glicose %1$@ caindo" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "glicemie %1$@ în scădere" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "глюкоза %1$@, падает" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "glykémia %1$@, klesá" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukos %1$@ sjunkande" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "KŞ %1$@ düşüyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "глюкоза %1$@, падає" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "đường huyết %1$@ đang giảm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖 %1$@ 下降中" + } + } + } + }, + "glucose %1$@ rising" : { + "comment" : "Logbook row detail: glucose when the dose was given, and rising. (1: glucose value, e.g. 11.0)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "السكر %1$@ يرتفع" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukóza %1$@, stoupá" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukose %1$@ stigende" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blutzucker %1$@ steigend" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "glucosa %1$@ subiendo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukoosi %1$@ nouseva" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "glycémie %1$@ en hausse" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "סוכר %1$@ עולה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "glükóz %1$@, emelkedő" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "glicemia %1$@ in salita" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖値 %1$@ 上昇中" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "blodsukker %1$@ stigende" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "glucose %1$@ stijgend" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukoza %1$@, rośnie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "glicose %1$@ subindo" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "glicemie %1$@ în creștere" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "глюкоза %1$@, растёт" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "glykémia %1$@, stúpa" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "glukos %1$@ stigande" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "KŞ %1$@ yükseliyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "глюкоза %1$@, зростає" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "đường huyết %1$@ đang tăng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖 %1$@ 上升中" + } + } + } + }, + "Glucose prediction unavailable" : { + "comment" : "VoiceOver label for the prediction chart when Loop has no prediction", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "توقع السكر غير متاح" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predikce glukózy není k dispozici" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoseforudsigelse ikke tilgængelig" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blutzuckervorhersage nicht verfügbar" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predicción de glucosa no disponible" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoosiennuste ei saatavilla" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prédiction de glycémie indisponible" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "תחזית סוכר אינה זמינה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glükózelőrejelzés nem érhető el" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Previsione glicemica non disponibile" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖値の予測はありません" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blodsukkerprognose ikke tilgjengelig" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosevoorspelling niet beschikbaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognoza glukozy niedostępna" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Previsão de glicose indisponível" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predicția glicemiei indisponibilă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прогноз глюкозы недоступен" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predikcia glykémie nie je k dispozícii" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukosprognos ej tillgänglig" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kan şekeri tahmini yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прогноз глюкози недоступний" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không có dự đoán đường huyết" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖预测不可用" + } + } + } + }, + "Glucose too old" : { + "comment" : "Reason Loop could not run: the latest glucose reading was too old", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قراءة السكر قديمة جدًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukóza je příliš stará" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukosemåling for gammel" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blutzuckerwert zu alt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosa demasiado antigua" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoosi liian vanha" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glycémie trop ancienne" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קריאת הסוכר ישנה מדי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Túl régi glükózérték" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicemia troppo vecchia" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖値が古すぎます" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blodsukkermåling for gammel" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosewaarde te oud" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoza zbyt stara" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicose muito antiga" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicemie prea veche" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Данные глюкозы устарели" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glykémia je príliš stará" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukosvärdet är för gammalt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kan şekeri verisi çok eski" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дані глюкози застаріли" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dữ liệu đường huyết quá cũ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖数据过旧" + } + } + } + }, + "Average Glucose" : { + + }, + "Basal Rate" : { + + }, + "Basal Rate Schedule" : { + "comment" : "Details for configuration error when basal rate schedule is missing", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "جدول الضخ المستمر" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basalrateskema" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basalraten-Plan" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Perfil Basal" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaaliohjelma" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Programme débit basal" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal Rate Schedule" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tabella di velocità basale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "基礎レートスケジュール" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tidsplan for basaldoser" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaalstandenschema" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Harmonogram dawki standardowej" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Programação da Taxa Basal" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Orar rate bazale" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Скорости базала" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Harmonogram bazálnej dávky" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaldosschema" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazal Oran Çizelgesi" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lịch biểu tiêm liều basal" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础率表" + } + } + } + }, + "Basal Rates" : { + "comment" : "The title of the basal rate profile screen\n The title text for the basal rate schedule", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الضخ المستمر" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Úrovně bazálu" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basalrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basalrate" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal Rates" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tasas basales" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaalitasot" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Débits basaux" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal Rates" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velocità basali" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "基礎レート" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basal-satser" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaalstanden" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dawka Podstawowa (Baza)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Taxas Basais" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rate bazale" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Скорости базала" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazálne dávky" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basaldoser" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bazal Oranlar" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lịch biểu tiêm liều nền" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "基础率" + } + } + } + }, + "Basal: " : { + + }, + "Based on your predicted glucose, no bolus is recommended." : { + "comment" : "Caption for bolus screen notice when no bolus is recommended for the predicted glucose", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baseret på din forventede glukose anbefales ingen bolus." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basierend auf Deinem vorhergesagten Blutzucker wird kein Bolus empfohlen." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basándose en su glucosa proyectada, no se recomienda ningún bolo." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sur la base de votre glycémie prévue, aucun bolus n’est recommandé." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בהתבסס על הגלוקוז החזוי שלך, לא מומלץ שום בולוס." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "In base alla glicemia prevista, non è consigliato alcun bolo." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Basert på ditt forventede blodsukker, anbefales ingen bolus." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Op basis van je voorspelde glucose, wordt een bolus niet aanbevolen." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Na podstawie przewidywanej glikemii nie zaleca się podawania bolusa." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pe baza glicemiei prognozate, nu se recomandă niciun bolus." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Основываясь на вашей прогнозируемой глюкозе, болюс не рекомендуется." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tahmini KŞ'ne bağlı olarak bolus önerilmez." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "根据您的预测血糖值,当前不建议注射大剂量。" + } + } + } + }, + "Because Omar has gone low while working outdoors in the past, he raises his preset correction range to help prevent another low." : { + + }, + "Before" : { + + }, + "Below range (<70): %d%% · goal <4%%" : { + "comment" : "TIR below-range summary" + }, + "Bluetooth\nOff" : { + "comment" : "Message to the user to that the bluetooth is off", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth slået fra" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth aus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\nApagado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth ei ole käytössä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth désactivé" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בלוטות׳ כבוי" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\nDisattivato" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blåtann\nAv" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\nUit" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth jest wyłączony" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth \nOprit" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\n Выключен" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth Av" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\nKapalı" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "蓝牙已关闭" + } + } + } + }, + "Bluetooth\nUnavailable" : { + "comment" : "Message to the user that bluetooth is unavailable to the app", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth ikke tilgængelig" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth nicht verfügbar" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth \nNo Disponible" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth ei ole käytettävissä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\nIndisponible" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בלוטות׳ לא זמין" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\nNon disponibile" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blåtann\nUtilgjengelig" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\nniet beschikbaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth niedostępny" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth \nIndisponibil" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\n Недоступен" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth är inte tillgängligt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\nKullanılamıyor" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "蓝牙不可用" + } + } + } + }, + "Bluetooth Off Alert" : { + "comment" : "Bluetooth off alert title", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Advarsel om Bluetooth slået fra" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth-Aus Warnung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alerta de Bluetooth apagado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth ei ole käytössä -hälytys" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth désactivé" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "התראת בלוטות׳ כבוי" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso Bluetooth disattivato" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth Avslått-varsel" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth uit melding" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alert! Bluetooth jest wyłączony!" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alertă Bluetooth dezactivat" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оповещение об отключении Bluetooth" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Varning Bluetooth är Av" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth Kapalı Uyarısı" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "蓝牙关闭提醒" + } + } + } + }, + "Bluetooth Unavailable Alert" : { + "comment" : "Bluetooth unavailable alert title", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth er ikke tilgængelig" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth nicht Verfügbar-Warnung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alerta de Bluetooth no disponible" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth ei ole käytettävissä -hälytys" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth indisponible" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "התראת בלוטות׳ לא זמין" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avviso Bluetooth non disponibile" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Varsel om at Bluetooth er utilgjengelig" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth niet beschikbaar melding" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alarm! Bluetooth niedostępny" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alertă Bluetooth indisponibil" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Оповещение о недоступности Bluetooth" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Varning Bluetooth är inte tillgänglig" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth Kullanılamıyor Uyarısı" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "蓝牙不可用提示" + } + } + } + }, + "Bolus" : { + "comment" : "Label for bolus entry row on bolus screen\nLabel for bolus entry row on simple bolus screen\nTitle for bolus entry screen", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ボーラス" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюс" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大剂量" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bólus" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюс" + } + } + } + }, + "Bolus Canceled: Delivered %1$@ of %2$@" : { + "comment" : "The title of the cell indicating a bolus has been canceled. (1: delivered volume)(2: total volume)" + }, + "Bolus Issue" : { + "comment" : "The notification title for a bolus issue", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusproblem" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus Problem" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Problema con el bolo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Problème avec le bolus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Problema con il bolo" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus feil" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusprobleem" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Problem z bolusem" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Problemă bolus" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Проблема с подачей болюса" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus Sorunu" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大剂量出现问题" + } + } + } + }, + "Bolus Recommendation Updated" : { + "comment" : "Alert title for an updated bolus recommendation", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusanbefaling opdateret" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktualisierte Bolusempfehlung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recomendación de bolo fue actualicada" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolussuositus päivitetty" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recommandation de Bolus modifiée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "המלצת בולוס התעדכנה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raccomandazioni sul bolo aggiornate" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus anbefaling er oppdatert" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aanbevolen bolus bijgewerkt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zaktualizowano rekomendowanego bolusa" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actualizare Recomandare bolus" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Рекомендации по болюсу обновлены" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det finns en ny bolusrekommendation" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus Önerisi Güncellendi" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大剂量推荐值已更新" + } + } + } + }, + "Bolus Summary" : { + "comment" : "Title for card displaying carb entry and bolus recommendation", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus-resumé" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus Zusammenfassung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resumen del bolo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusyhteenveto" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Résumé du bolus" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "סיכום" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riepilogo bolo" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus oppsummering" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolussamenvatting" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podsumowanie bolusa" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rezumat Bolus" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Суммарный болюс" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus sammanfattning" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus Özeti" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大剂量概要" + } + } + } + }, + "Bolus Too Small" : { + "comment" : "Alert title for a bolus too small validation error", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus for lille" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus zu gering" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo demasiado pequeño" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus trop petit" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בולוס קטן מדי" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo troppo piccolo" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus er for liten" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus te klein" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Za mały bolus" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus prea mic" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюс слишком маленький" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus Çok Küçük" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大剂量太少" + } + } + } + }, + "Bolus: " : { + + }, + "Bolused %1$@ of %2$@" : { + "comment" : "The format string for bolus progress. (1: delivered volume)(2: total volume)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تم ضخ %1$@ من %2$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ af %2$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ von %2$@ verabreicht" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administró bolo %1$@ de %2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ / %2$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus délivré %1$@ sur %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוזרק %1$@ מתוך %2$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo %1$@ di %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%2$@ のうち %1$@ ボーラス済" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@ av %2$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ van %2$@ gebolust" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podano %1$@ z %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entregue %1$@ of %2$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus administrat %1$@ of %2$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подан болюс%1$@ из %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podaný bolus %1$@ z %2$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Givit bolus %1$@ av %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "İletilen Bolus %1$@ / %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã thực hiện Bolus %1$@ của %2$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "大剂量已输注%1$@ of %2$@" + } + } + } + }, + "Bolusing %1$@" : { + "comment" : "The format string for bolus in progress showing total volume. (1: total volume)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يضخ %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusabgabe %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administrando bolo de %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annetaan bolus %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus en cours %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מזריק בולוס: %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo in corso %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ボーラス中" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gir bolus %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolussen %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podawanie %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aplicando %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus în administrare %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подается болюс" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus sa podáva" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ger bolus %1$@ " + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đang thực hiện bolus %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@大剂量注射中" + } + } + } + }, + "Bottom row" : { + "comment" : "Live activity Bottom row configuration title", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untere Zeile" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ligne inférieure" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bunnrad" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Onderste rij" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rândul de jos" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "底部行" + } + } + } + }, + "Bottom row configuration" : { + "comment" : "Title for Bottom row configuration", + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration der unteren Zeile" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration de la ligne inférieure" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurasjon av bunnraden" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Onderste rij instellen" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurația rândului de jos" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "底部行配置" + } + } + } + }, + "Breathing is slightly uncomfortable. Conversation requires maximal effort." : { + + }, + "Breathing more heavily. Can carry on a conversation, but requires more effort." : { + + }, + "by %@" : { + "comment" : "A label displaying the author of the podcast. The argument is the podcast's author.", + "isCommentAutoGenerated" : true + }, + "Can I use Focus modes with %1$@?" : { + "comment" : "Focus modes section title (1: app name)" + }, + "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\nThe title of the cancel button in the plugin picker", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إلغاء" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zrušit" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annuller" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abbrechen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancelar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kumoa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annuler" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בטל" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annulla" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "キャンセル" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avbryt" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annuleer" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anuluj" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancelar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anulați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Отмена" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zrušiť" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avbryt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "İptal" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hủy bỏ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "取消" + } + } + } + }, + "Cancel the manual temporary basal if you wish for the app to restart automated dosing.\n\nIf you wish for the app to automate your insulin, go to Settings and toggle Closed Loop to on." : { + "comment" : "message when automation is off and a manual temp basal is in progress" + }, + "Canceling Bolus" : { + "comment" : "The title of the cell indicating a bolus is being canceled", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إلغاء الجرعة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annullerer bolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus abbrechen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancelando bolo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kumotaan bolus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annulation du Bolus en cours" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מבטל בולוס" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annullamento bolo in corso" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ボーラスをキャンセルします" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avbryter bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus annuleren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anulowanie bolusa" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancelando Bolus" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Întrerupere bolus" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Отмена болюса" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus sa ruší" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avbryter bolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus İptal ediliyor" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hủy bỏ liều Bolus" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "取消大剂量" + } + } + } + }, + "Carb effects" : { + "comment" : "Details for missing data error when carb effects are missing", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تأثيرات الكارب" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kulhydrateffekter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kohlenhydrat-Wirkungen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Efectos de carbohidratos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiilihydraattivaikutus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effets des glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "השפעות פחמימות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effetto carboidrati" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "糖質効果" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb effekter" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraateffecten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wpływ węglowodanów" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Efeitos Carb" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Efecte carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Влияние углеводов" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Účinky sacharidov" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kolhydrateffekter" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karbonhidrat etkileri" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "các tác động của Carb" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "碳水效果" + } + } + } + }, + "Carb Entry" : { + "comment" : "Label for carb entry row on bolus screen", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indtast kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH-Eintrag" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrada de Carbohidratos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiilihydraatit" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrée de glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פחמימות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidrati inseriti" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraatinvoer" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wprowadź węglowodany" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intrare carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить запись углеводов" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb Girişi" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "碳水记录" + } + } + } + }, + "Carb Quantity" : { + "comment" : "Label for carb quantity row on add favorite food screen", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Menge gegessen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quantité de glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כמות פחמימות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidrati Assunti" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Antall karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hoeveelheid koolhydraten" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cantitate carbohidrați" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "碳水含量" + } + } + } + }, + "Carb Ratio" : { + + }, + "Carb Ratio Schedule" : { + "comment" : "Details for configuration error when carb ratio schedule is missing", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tidsplan for kulhydratforhold" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zeitplan für das Kohlenhydratverhältnis" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Calendario de ratio de carbohidratos" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Programme des ratios Insuline-Glucides" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tabella del rapporto carboidrati" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tidsplan for karbohydratforhold" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraatratioschema" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Harmonogram Współczynnika Węglowodanowego" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Programul raportului de carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Расписание соотношения углеводов" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb Oranı Programı" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "碳水系数配置表" + } + } + } + }, + "Carb Ratios" : { + "comment" : "The title of the carb ratios schedule screen\n The title text for the carb ratio schedule", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "معاملات الكارب" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kulhydratforhold" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH-Verhältnis" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carb Ratios" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ratios de carbohidratos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiilihydraattisuhteet" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ratios Insuline-Glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carb Ratios" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rapporti carboidrati" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carb Ratios" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb forhold" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraatratio's" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Współczynniki węglowodanowe" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Taxas de Carbs" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Raport carbohidrați insulină" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Соотношения углеводов" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulínovo sacharidový pomer" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulinkvoter" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karbonhidrat Oranları" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carb Ratios" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "碳水化合物系数" + } + } + } + }, + "carb-entry-title-add" : { + "comment" : "The title of the view controller to create a new carb entry", + "extractionState" : "extracted_with_value", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add Carb Entry" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kohlenhydrate hinzufügen" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add Carb Entry" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agregar Entrada de Carb" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lisää hiilihydraatteja" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter des glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הוספת רשומת פחמימות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aggiungi inserimento carboidrati" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "糖質の記入を追加" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg inn karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraten toevoegen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wprowadź węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adicionar Carb" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Adăugați carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Добавить запись углеводов" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zadať sacharidy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karb Girişi Ekle" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khai báo Carb" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "添加碳水摄入" + } + } + } + }, + "Carbohydrate Entry Too Large" : { + "comment" : "Title for bolus screen warning when carbohydrate entry is too large", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kulhydratindtastning for stor" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KH-Eintrag zu groß" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrada de carbohidratos demasiado grande" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Les glucides saisis sont trop important" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כמות פחמימות גדולה מדי" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidrati inseriti troppo alti" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karbohydratinntaket er for stort" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraatinvoer te veel" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wpis węglowodanów za duży" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intrarea de carbohidrați este prea mare" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Слишком много углеводов" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karbonhidrat Girişi Çok Büyük" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "碳水化合物输入量过大" + } + } + } + }, + "Carbohydrates" : { + "comment" : "Health access row label for carbohydrates\nLabel for carbohydrates entry row on simple bolus screen\nTitle of the prediction input effect for carbohydrates", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الكربوهيدرات" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kohlenhydrate" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidratos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiilihydraatit" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucides" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פחמימות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidrati" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残存糖質" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koolhydraten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Węglowodany" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidratos" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Углеводы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sacharidy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kolhydrater" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Karbonhidratlar" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohydrates" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "碳水化合物" + } + } + } + }, + "Carbs Absorbed (g) ÷ Carb Ratio (g/U) × Insulin Sensitivity (%1$@/U)" : { + "comment" : "Description of the prediction input effect for carbohydrates. (1: The glucose unit string)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الكارب الذي تم امتصاصه (جرام) ÷ معامل الكارب (جرام لكل وحدة) × حاسية الأنسولين (%1$@/وحدة)" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kulhydrater absorberet (g) ÷ Kulhydratratio (g/E) × Insulinfølsomhed (%1$@/E)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resorbierte Kohlenhydrate (g) ÷ Kohlenhydratfaktor (g/IE) × Insulinempfindlichkeit (%1$@/IE)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidratos absorbidos (gr) ÷ Relación de Carbohidratos (gr/U) x Sensibilidad a Insulina (%1$@/U)" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Imeytyneet hiilihydraatit (g) ÷ Hiilihydraattisuhde (g/U) × Insuliiniherkkyys (%1$@/U)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucides Absorbés (g) ÷ Ratio Glucides (g/U) x Sensibilité à l'insuline (%1$@/U)" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbs Absorbed (g) ÷ Carb Ratio (g/U) × Insulin Sensitivity (%1$@/U)" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carboidrati assorbiti ÷ Rapporto carboidrati (gr/U) × Sensibilità insulinica (%1$@/U)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "吸収済糖質(g) ÷ 糖質比 (g/U) × インスリン効果値(%1$@/U)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Absorberte karbohydrater (g) ÷ Karbforhold (g/E) × insulinfølsomhet ( %1$@ /E)" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opgenomen koolhydraten (g) ÷ koolhydraatratio (g/E) × insulinegevoeligheid (%1$@/E)" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ilość węglowodanów (g) ÷ stosunek węglowodanów (g/J) × czułość insuliny (%1$@/J)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbs Absorvidos (g) ÷ Relação Carb (g/U) × Sensibilidade a Insulina (%1$@/U)" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Carbohidrați absorbiți (g) ÷ Raport carbohidrați (g/U) × Factor de sensibilitate la insulină (%1$@/U)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Усвоенные углеводы (г) ÷ Коэффициент углеводов (г/U) × Чувствительность к инсулину (%1$@/U)" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Absorbované sacharidy (g) ÷ Inzulínovo sacharidový pomer (g/j) × Faktor citlivosti na inzulín (%1$@/j)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Absorberade kolhydrater (g) ÷ Insulinkvot (g/E) × Insulinkänslighet (%1$@/E)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emilen Karb. (gr) ÷ Karb. Oranı (gr/Ü) × İnsulin duyarlılığı (%1$@/Ü)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khối lượng carb tiêu thụ (g) ÷ Tỷ lệ Carb (g/U) × Độ nhạy của Insulin (%1$@/U)" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "已吸收碳水化合物(克)÷碳水化合物吸收率(克 / 单位)×胰岛素敏感系数 (%1$@/单位)" + } + } + } + }, + "Caution" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forsigtig" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Achtung" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attention" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "זהירות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attenzione" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forsiktig" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voorzichtig" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uwaga" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Atenție" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "注意" + } + } + } + }, + "CAUTION - Investigational device. Limited by Federal (or United States) law to investigational use." : { + + }, + "CGM Active" : { + "comment" : "Percent of time CGM data present metric title" + }, + "Change the pump battery immediately" : { + "comment" : "The notification alert describing a low pump battery", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قم بتغيير بطارية المضخة على الفور" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Udskift pumpebatteri omgående" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wechsel sofort die Pumpenbatterie" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Change the pump battery immediately" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cambie la batería de la bomba de inmediato" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vaihda pumpun paristo välittömästi" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Changer immédiatement la pile de la pompe" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Change the pump battery immediately" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sostituisci immediatamente la batteria della pompa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "すぐにポンプの電池を替えてください" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skift pumpebatteriet umiddelbart" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vervang direct de batterij van de pomp" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Natychmiast wymienić baterię pompy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Troque a bateria da bomba imediatamente" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schimbați imediat bateria pompei" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немедленно замените батарейку в помпе" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ihneď vymeňte batériu pumpy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Byt pumpbatteri nu" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pompa pilini hemen değiştirin" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thay pin máy bơm ngay" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "立即更换胰岛素泵电池" + } + } + } + }, + "Change the pump reservoir now" : { + "comment" : "The notification alert describing an empty pump reservoir", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قم بتغيير خزان المضخة الآن" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skift pumpereservoir nu" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wechsel jetzt das Pumpenreservoir" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Change the pump reservoir now" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cambie el depósito de la bomba ahora" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vaihda pumpun säiliö" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Changer maintenant le réservoir de la pompe" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Change the pump reservoir now" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cambia ora il serbatoio della pompa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ポンプのレザーバを替えてください" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bytt pumpereservoar nå" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vervang het pompreservoir nu" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zmień zbiorniczek w pompie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Troque o reservatório da bomba agora" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schimbați rezervorul pompei acum" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замените резервуар помпы сейчас" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ihneď vymeňte zásobník pumpy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Byt pumpreservoar nu" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pompa rezervuarını şimdi değiştirin" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thay ngăn chứa insulin bây giờ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "立即更换储药器" + } + } + } + }, + "Changing it can lower the chance of your glucose levels going too low if you expect unusual changes." : { + + }, + "Check for potential communication issues with your CGM.\n\nIn the meantime, your pump is still able to deliver insulin." : { + "comment" : "message when automation is off and CGM is in signal loss" + }, + "Check settings" : { + "comment" : "Details for configuration error when one or more loop settings are missing", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تأكد من الإعدادات" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontroller indstillinger" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Überprüfe die Einstellungen." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Check settings" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verificar ajustes" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tarkista asetukset" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vérifier les paramètres" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Check settings" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controlla le impostazioni" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定を確認する" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sjekk innstillinger" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controleer instellingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sprawdź ustawienia" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verifique as configurações" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verificați setările" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Проверьте настройки" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontrollera inställningarna" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ayarları kontrol et" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kiểm tra các cài đặt" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "检查设置" + } + } + } + }, + "Check that your pump is in range" : { + "comment" : "Recovery suggestion when reservoir data is missing", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تأكد أن المضخة في النطاق" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontroller, at din pumpe er indenfor rækkevidde" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stelle sicher, dass sich Deine Pumpe in Reichweite befindet." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Check that your pump is in range" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verifique que su microinfusora esté dentro del rango" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tarkista, että pumppu on riittävän lähellä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vérifier que votre pompe est à portée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Check that your pump is in range" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controlla che la pompa sia nel raggio d'azione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ポンプが近くにあることを確認してください" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sjekk at pumpen din er innenfor rekkevidde" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controleer of je pomp binnen bereik is" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Upewnij się, że Twoja pompa jest w zasięgu" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verifique se sua bomba está dentro do alcance" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verificați că pompa este în apropriere" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Убедитесь, что помпа в зоне коммуникации" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontrollera att pumpen är inom räckhåll" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pompanızın menzil içinde olup olmadığını kontrol edin" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kiểm tra máy bơm đang trong phạm vi cho phép" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请检查你的泵是否在范围内" + } + } + } + }, + "Check your CGM data source" : { + "comment" : "Recovery suggestion when glucose data is missing", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تأكد من مصدر قراءات السكر المستمرة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontroller din CGM-datakilde" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Überprüfe Deine CGM-Datenquelle." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verifique su fuente de datos CGM" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tarkista CGM-tietolähde" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vérifier votre source de données CGM" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בדוק את מקור המידע שלך בחיישן" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controlla la sorgente dati del sensore" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM データソースを確認してください" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sjekk CGM" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controleer je CGM gegevensbron" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sprawdź swój CGM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verifique seu dispositivo CGM" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verificați sursa de date a senzorului de glicemie" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Проверьте источник мониторинга СК" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontrollera din CGM:s datakälla" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM veri kaynağınızı kontrol edin" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kiểm tra nguồn dữ liệu CGM của bạn" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请检查你的动态血糖数据来源" + } + } + } + }, + "Check your device time and/or remove any invalid data from Apple Health." : { + "comment" : "Caption for bolus screen notice when glucose data is in the future", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tjek din enheds tid og/eller fjern ugyldige data fra Apple Health." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Überprüfe die Uhrzeit deines Geräts und/oder entferne alle ungültigen Daten aus Apple Health." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compruebe la hora de su dispositivo y/o elimine cualquier dato no válido de Apple Health." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vérifiez l'heure de votre appareil et/ou supprimez toute donnée invalide d'Apple Health." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controlla l'orario del tuo dispositivo e/o rimuovi eventuali dati non validi da Apple Salute." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sjekk enhetens klokke og/ eller fjern eventuelle ugyldige data fra Apple Helse." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Controleer de tijd op je apparaat en/of verwijder eventuele ongeldige invoer uit Apple Gezondheid." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sprawdź czas urządzenia i/lub usuń wszelkie nieprawidłowe dane z aplikacji Zdrowie." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verificați ora dispozitivului și/sau eliminați orice date incorecte din Apple Health." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Проверьте время вашего устройства и/или удалите недействительные данные из Apple Health." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aygıtınızın saatini kontrol edin ve/veya tüm geçersiz verileri Apple Sağlık'tan kaldırın." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请检查设备时间,并/或从“苹果健康”App中删除任何无效数据。" + } + } + } + }, + "Check your glucose levels around 20 to 30 min after eating. If you're still low, consider eating the same amount." : { + + }, + "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." : { + "comment" : "Carb entry section footer text explaining absorption time", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vælg en længere absorptionstid ved større måltider, eller dem med fedt og proteiner. Det er blot hjælp til algoritmen og behøver ikke være nøjagtig." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wähle eine längere Resorptionsdauer für größere Mahlzeiten oder welche die viel Fett und Proteine beinhalten. Dies ist eine Unterstützung für den Algorithmus und muss nicht genau sein." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elija un tiempo de absorción más largo para comidas más grandes, o aquellas que contienen grasas y proteínas. Esta es solo una guía para el algoritmo y no necesita ser exacta." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Valitse pidempi imeytymisaika isoille tai paljon rasvaa ja proteiineja sisältäville aterioille. Tämä on suuntaa antava ohje, eikä sen tarvitse olla tarkka." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Choisissez un temps d’absorption plus long pour les gros repas ou ceux contenant des graisses et des protéines. Ceci est seulement un guide pour l'algorithme et n'a pas besoin d'être exact." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "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." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scegli un periodo di assorbimento piu lungo per i pasti piu grandi o quelli contenenti grassi e proteine. Questa e solo una guida all’algoritmo e non e necessario che sia esatta." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "量の多い食事や脂質やたんぱく質を含んだ食事には長い吸収時間を選んでください。これはアルゴリズムのための参考で、厳密である必要はありません。" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velg lengre absorpsjonstid for større måltider, eller de som inneholder fett og proteiner. Dette er kun veiledning til algoritmen og trenger ikke være nøyaktig." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kies een langere opnametijd voor grotere maaltijden of voor maaltijden die vetten en eiwitten bevatten. Dit is alleen een leidraad voor het algoritme en hoeft niet exact te zijn." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wybierz dłuższy czas absorpcji dla większych, bogatobiałkowych lub wysokotłuszczowych posiłków. To tylko wskazówka dla algorytmu i nie musi być bardzo dokładna." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Escolha um tempo de absorção mais longo para refeições maiores ou aquelas que contenham gorduras e proteínas. Esta é apenas uma orientação para o algoritmo e não precisa ser exata." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alegeți o durată mai lungă de absorbție pentru mese mai mari sau pentru cele care conțin grăsimi și proteine. Nu e necesară o valoare exactă, scopul e să oferim doar o ghidare pentru algoritm." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Выберите более длительное время усвоения для больших порций пищи или тех, которые содержат жиры и белки. Это лишь руководство к алгоритму и не обязательно должно быть точным." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Välj en längre absorptionstid för måltid med mycket fett eller protein. Ofta är det bäst att dela upp måltiden i snabba och långsamma kolhydrater och mata in dessa var för sig." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Daha büyük öğünler veya yağ ve protein içeren besinler için daha uzun bir emilim süresi seçin. Bu değer yalnızca algoritmaya rehberlik eder ve kesin olması gerekmez." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lựa chọn khoảng thời gian tiêu hóa dài hơn cho các bữa ăn no, hoặc những bữa ăn nhiều chất béo và protein. Đây chỉ là hướng dẫn cho thuật toán Algorithm và không cần phải chính xác." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "对于大餐或含有脂肪和蛋白质的餐食,请选择较长的吸收时间。此设置仅作为算法的参考, 无需精确。" + } + } + } + }, + "Choose Favorite:" : { + "comment" : "The label for the row where you choose saved Favorite Food", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vælg favorit:" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wähle Favorit:" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Choisissez le favori :" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scegli il preferito:" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velg favoritt:" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kies favoriet:" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wybierz ulubione:" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alegeți preferatul:" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择常用" + } + } + } + }, + "Choose the glucose value (or values) you want %@ to target when changing how much basal insulin you get." : { + + }, + "Close" : { + "comment" : "Preset training needed alert cancel button\nThe button label of the action used to dismiss the unsafe notification permission alert", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Luk" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schließen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cerrar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sulje" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fermer" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "סגור" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chiudi" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukk" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluiten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zamknij" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Închideți" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Закрыть" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stäng" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapat" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关闭" + } + } + } + }, + "Close Training" : { + + }, + "Closed Loop" : { + "comment" : "The title text for the looping enabled switch cell", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حلقة مغلقة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Circuito Cerrado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle Fermée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "クローズドループ" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla Zamknięta" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciclo Fechado" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten loop" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı Döngü" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vòng lặp kín" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环模式" + } + } + } + }, + "Closed Loop OFF" : { + "comment" : "Alert title for closed loop off informational modal", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket loop FRA" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop AUS" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Asa cerrada APAGADA" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö pois päältä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Boucle Ouverte" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso disattivato" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop AV" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop UIT" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pętla zamknięta WYŁĄCZONA" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buclă închisă dezactivată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл ВЫКЛ" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten Loop är AV" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı Döngü KAPALI" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环模式已关闭" + } + } + } + }, + "Closed Loop requires an active CGM Sensor Session" : { + "comment" : "The description text for the looping enabled switch cell when closed loop is not allowed because the sensor is inactive", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop kræver en aktiv CGM sensor-session" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop erfordert eine aktive CGM-Sensorsitzung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La asa cerrada requiere una sesión de sensor CGM activa" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suljettu säätö vaatii aktiivisen glukoosisensorin" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop en boucle fermée requiert une session de capteur CGM active." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso richiede almeno una sessione attiva del sensore CGM" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop krever en aktiv CGM sensorøkt" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop vereist een lopende CGM-sensorsessie" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zamknięta pętla wymaga aktywnego sensora CGM" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bucla închisă necesită o sesiune activă a unui senzor de glicemie" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл требует активного подключенного датчика CGM" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluten Loop kräver en aktiv CGM-sensor" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı Döngü, aktif bir CGM Sensör Oturumu gerektirir" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "闭环需要活动的 CGM 传感器会话" + } + } + } + }, + "Closed Loop requires Setup to be Complete" : { + "comment" : "The description text for the looping enabled switch cell when onboarding is not complete", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop kræver, at opsætningen er fuldført" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Closed Loop erfordert, dass die Einrichtung abgeschlossen ist" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "El Circuito Cerrado requiere que la configuración esté completa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop en boucle fermée nécessite une configuration complète" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop chiuso richiede che la configurazione sia completata" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lukket Loop krever at installasjonen er fullført" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actieve loop vereist dat de installatie is voltooid" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zamknięta pętla wymaga zakończenia konfiguracji" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bucla închisă necesită ca setarea să fie finalizată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замкнутый цикл требует завершения настройки" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapalı Döngü, Kurulumun Tamamlanmasını gerektirir" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用闭环控制前需完成所有设置。" + } + } + } + }, + "com.loudnate.InsulinKit.IOBDateLabel" : { + "comment" : "The format string describing the date of an IOB value. The first format argument is the localized date.", + "extractionState" : "extracted_with_value", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "d %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "um %1$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "at %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "en %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "klo %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "à %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ב-%1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "a %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ 時点" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "kl. %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "om %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "o %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "em %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "la %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "в %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "kl %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "lúc %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 %1$@" + } + } + } + }, + "com.loudnate.InsulinKit.totalDateLabel" : { + "comment" : "The format string describing the starting date of a total value. The first format argument is the localized date.", + "extractionState" : "extracted_with_value", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "siden %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "seit %1$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "since %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "desde %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ jälkeen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "depuis %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מאז %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "da %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ より" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "siden %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "sinds %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "od %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "desde %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "de la %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "с %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "sedan %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ den beri" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "từ lúc %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自从 %1$@" + } + } + } + }, + "com.loudnate.LoopKit.errorAlertActionTitle" : { + "comment" : "The title of the action used to dismiss an error alert", + "extractionState" : "extracted_with_value", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "موافق" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "OK" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אישור" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tamam" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + } + } + }, + "Combination of high and low intensity" : { + + }, + "Competition Stress" : { + + }, + "Complete each section below to learn how presets can be used for a variety of situations." : { + + }, + "Complete Setup" : { + "comment" : "Title text for button to complete setup", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fuldfør opsætning" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einstellungen abschließen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Completa la Configuración" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Terminer la configuration" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Completa configurazione" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fullfør oppsett" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Volledige installatie" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zakończ konfigurację" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurare finalizată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Завершить настройку" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kurulumu Tamamla" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "完成设置" + } + } + } + }, + "Configuration" : { + "comment" : "The title of the Configuration section in settings", + "extractionState" : "stale", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المعطيات" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurace" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuración" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Määritykset" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurazione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "コンフィグレーション" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurasjon" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuratie" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguracja" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuração" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurare" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Конфигурация" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurácia" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfiguration" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigürasyon" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cấu hình" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置" + } + } + } + }, + "Configuration Error: %1$@" : { + "comment" : "The error message displayed for configuration errors. (1: configuration error details)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "خطأ في المعطيات: %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurationsfejl: %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurationsfehler: %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error de Configuración: %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Määritysvirhe: %1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erreur de Configuration: %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration Error: %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errore di configurazione: %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定エラー: %1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurasjonsfeil: %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuratiefout: %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Błąd konfiguracji: %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erro de Configuração: %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eroare configurare: %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ошибка конфигурации: %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurationsfel %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigürasyon Hatası: %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lỗi cấu hình: %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置错误:%1$@" + } + } + } + }, + "Configure Display" : { + "comment" : "Title for the view to configure the lock screen display", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anzeige konfigurieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurer l'affichage" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilpass skjermen" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Scherm configureren" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurați afișajul" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示设置" + } + } + } + }, + "Configure Lock Screen / Carplay Row" : { + "comment" : "A link that takes the user to a view where they can configure the display of the live activity screen on their lock screen and in CarPlay.", + "isCommentAutoGenerated" : true, + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sperrbildschirm / CarPlay-Zeile konfigurieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurer l'écran de verrouillage / CarPlay" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilpass låseskjerm / Carplay rad" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rij voor toegangsscherm / CarPlay instellen" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configurați ecranul de blocare / rândul CarPlay" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "配置锁屏 / CarPlay 显示行" + } + } + } + }, + "Congratulations! You've finished the Presets training." : { + + }, + "Consider an exercise you do regularly and think about how hard you push yourself." : { + + }, + "Consider eating around 10 to 20 grams of fast-acting carbs" : { + + }, + "Continue" : { + "comment" : "Button label for continue\nDefault alert dismissal", + "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pokračovat" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fortsæt" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weiter" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jatka" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuer" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continue" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continua" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "次へ" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fortsett" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ga verder" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontynuuj" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Продолжить" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pokračovať" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fortsätt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Devam et" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiếp tục" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "继续" + } + } + } + }, + "Continue to %@" : { + + }, + "Continuous Glucose Monitor" : { + "comment" : "Descriptive text for Continuous Glucose Monitor", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نظام متابعة السكر المستمرة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontinuerlig Blodsukker Måler (CGM)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontinuierliche Blutzuckermessung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Monitor de glucosa continuo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoosinseuranta (CGM)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lecteur de glycémie en continu" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuous Glucose Monitor" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Monitoraggio continuo glicemia" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontinuerlig glukosemonitor" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continue glucose monitor" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ciągły Monitoring Glukozy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Monitoramento Contínuo de Glicose" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Senzor de monitorizare continuă a glicemiei" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Непрерывный мониторинг гликемии" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontinuerlig glukosmätning" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sürekli Glikoz İzleme" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kiểm soát đường huyết liên tục" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "连续血糖监测仪" + } + } + } + }, + "Continuous or exercise without breaks" : { + + }, + "Correction Range" : { + "comment" : "The title of the glucose target range schedule screen\n The title text for the glucose target range schedule", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نطاق التصحيح" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Korrektionsområde" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Korrekturbereich" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Correction Range" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rango de Corrección" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Korjausalue" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plage de correction" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "טווח תיקון" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intervallo di correzione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ターゲット範囲" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Korreksjonsområde" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Correctiebereik" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zakres docelowy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Faixa de Correção" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Interval de corecție" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Диапазон коррекции" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Målvärde" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Düzeltme Aralığı" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Phạm vi liều Bổ sung" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "校正范围" + } + } + } + }, + "Correction range is a " : { + + }, + "Correction range is a **safety setting**. Changing it can help lower your risk of going low if you expect unusual changes." : { + + }, + "Could Not Restart %1$@" : { + "comment" : "Format string for title of reset loop alert. (1: App name)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke genstarte %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ konnte nicht neu gestartet werden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossible de redémarrer %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile riavviare %1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke starte %1$@ på nytt" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kan %1$@ niet herstarten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie można ponownie uruchomić %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nu s-a putut reporni %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法重启 %1$@" + } + } + } + }, + "Create new presets" : { + + }, + "Critical Alerts" : { + "comment" : "Critical Alerts Status text", + "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritická upozornění" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritiske advarsler" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritische Warnungen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alertas críticas" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alertes critiques" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avvisi critici" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritiske varsler" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritieke meldingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alerty krytyczne" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alerte critice" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Критические оповещения" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritické výstrahy" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritik Uyarılar" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关键通知" + } + } + } + }, + "Critical Alerts and Time Sensitive Notifications are important types of iOS notifications used for events that require immediate attention. Examples include:" : { + + }, + "Critical Alerts and Time Sensitive Notifications are turned OFF" : { + "comment" : "Both Critical Alerts and Time Sensitive Notifications disabled banner title" + }, + "Critical Alerts and Time Sensitive Notifications are turned OFF. Go to the App to fix the issue now." : { + "comment" : "Both Critical Alerts and Time Sensitive Notifications disabled notification body" + }, + "Critical Alerts and Time Sensitive Notifications are turned off. You may not get sound, visual or vibration alerts regarding critical safety information.\n\nTo fix the issue, tap ‘Settings’ and make sure Critical Alerts and Time Sensitive Notifications are turned ON." : { + "comment" : "Both Critical Alerts and Time Sensitive Notifications disabled alert body" + }, + "Critical Alerts and Time Sensitive Notifications are turned off. You may not get sound, visual or vibration alerts regarding critical safety information.\n\nTo fix the issue, tap ‘Settings’ and make sure Notifications and Critical Alerts are turned ON." : { + "comment" : "Both Notifications and Critical Alerts disabled alert body" + }, + "Critical Alerts are turned OFF" : { + "comment" : "Critical alerts disabled banner title" + }, + "Critical Alerts are turned OFF. Go to the App to fix the issue now." : { + "comment" : "Critical alerts disabled notification body" + }, + "Critical Alerts are turned off. You may not get sound, visual or vibration alerts regarding critical safety information.\n\nTo fix the issue, tap ‘Settings’ and make sure Critical Alerts are turned ON." : { + "comment" : "Critical alerts disabled alert body" + }, + "Critical Alerts require a special permission from Apple that many do-it-yourself versions of %1$@ don't include. Without it, iOS treats even urgent alarms as ordinary notifications, so the Ring/Silent switch, Do Not Disturb, and Focus modes can silence them." : { + "comment" : "Description text explaining the critical alerts entitlement may be unavailable (1: app name)" + }, + "Critical Alerts will still sound, but all others will be silenced." : { + "comment" : "Additional description text for temporarily silencing non-critical alerts" + }, + "Critical Event Log Ready" : { + "comment" : "Critical event log ready text", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritisk begivenhedslog klar" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritisches Ereignisprotokoll bereit" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro de eventos críticos listo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tärkeiden tapahtumien loki valmis" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Journal des événements critiques prêt" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registro eventi critici pronto" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritisk hendelseslogg er klar" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritieke gebeurtenislogboek klaar" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dziennik zdarzeń krytycznych gotowy" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jurnal evenimente critice pregătit" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Логи критических событий готовы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritisk händelselogg klar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritik Olay Günlüğü Hazır" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关键事件日志已就绪" + } + } + } + }, + "Critical Event Logs" : { + "comment" : "Critical event log export title", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritisk begivenhedslog" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritische Ereignisprotokolle" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registros de eventos críticos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tärkeiden tapahtumien loki" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Journaux des événements critiques" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Registri eventi critici" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritiske hendelseslogger" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritieke gebeurtenislogboek" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dzienniki zdarzeń krytycznych" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jurnal de evenimente critice" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Логи критических событий" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritiska händelseloggar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritik Olay Günlükleri" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "关键事件日志" + } + } + } + }, + "Critical Event Logs were not able to be exported." : { + "comment" : "Critical event log export error alert message", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritisk begivenhedslogs kunne ikke eksporteres." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritische Ereignisprotokolle konnten nicht exportiert werden." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No se han podido exportar los registros de eventos críticos." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tärkeiden tapahtumien lokia ei voitu viedä." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Les journaux d'événements critiques n'ont pas pu être exportés." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non è stato possibile esportare i registri degli eventi critici." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritiske hendelseslogger kunne ikke eksporteres." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritieke gebeurtenislogboeken konden niet worden geëxporteerd." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie można wyeksportować dzienników zdarzeń krytycznych." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jurnalele de evenimente critice nu au putut fi exportate." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось экспортировать журналы критических событий." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritiska händelseloggar kunde inte exporteras." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritik Olay Günlükleri dışa aktarılamadı." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法导出关键事件日志。" + } + } + } + }, + "CrossFit" : { + + }, + "Current Basal Rate" : { + + }, + "Current Delivery" : { + + }, + "Current Glucose" : { + "comment" : "Label for glucose entry row on simple bolus screen", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuværende blodsukker" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktueller Blutzucker" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosa actual" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nykyinen glukoosi" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glycémie actuelle" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicemia attuale" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nåværende blodsukker" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Huidige glucose" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktualna glukoza" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicemia curentă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Текущая глюкоза" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuvarande blodglukosvärde" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mevcut KŞ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当前血糖" + } + } + } + }, + "Current glucose of %1$@ is below correction range." : { + "comment" : "Message when offering bolus recommendation even though bg is below range. (1: glucose value)", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قراءة سكر الدم %1$@ أقل من نطاق التصحيح." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Den aktuelle glukose for %1$@ er under korrektionsområdet." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der aktuelle Blutzucker von %1$@ liegt unter dem Korrekturbereich." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosa actual de %1$@ está por debajo del rango de corrección." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nykyinen glukoosi %1$@ on korjausalueen alapuolella." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glycémie actuelle de %1$@ est en dessous de la plage de correction." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Current glucose of %1$@ is below correction range." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La glicemia attuale di %1$@ è al di sotto dell'intervallo glicemico." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "現在の血糖値は %1$@ で補正範囲を下回っています。" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gjeldende blodsukker på %1$@ er under korreksjonsområdet." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Huidige glucose %1$@ is lager dan het correctiebereik." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poziom glukozy %1$@ jest poniżej wartości korekcji." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : " Glicemia atual %1$@ está abaixo da zona de correção." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicemia actuală de %1$@ se situează sub intervalul de corecție." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Гликемия %1$@ ниже диапазона коррекции" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktuálna glykémie %1$@ je pod cieľovým rozsahom." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nuvarande glukosvärde %1$@ är under målvärde." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ Mevcut KŞ düzeltme aralığının altında." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : " Chỉ số glucose hiện tại %1$@ nằm dưới Phạm vi Điều chỉnh." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "当前血糖%1$@低于校正范围" + } + } + } + }, + "Custom Override" : { + "comment" : "The title of the cell indicating a generic temporary override is enabled", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تجاوز مخصص" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Brugerdefineret Override" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benutzerdefinierter Override" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Custom Override" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sobreescritura personalizada" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mukautettu tilapäisasetus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajustement personnalisé" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Custom Override" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Override personalizzato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "カスタムオーバーライド" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilpasset overstyring" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aangepaste Override" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Custom Override" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sobreposição Personalizada" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suprascriere personalizată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Настраиваемое ручное управление" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anpassad Override" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Özel Geçersiz kılma" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thói quen Chồng liều" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自定义覆盖" + } + } + } + }, + "Custom preset" : { + "comment" : "The title of the cell indicating a generic custom preset is enabled", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Benutzerdefinierte Voreinstellung" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Préréglage personnalisé" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Engendefinert forhåndsinnstilling" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aangepast programma" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Presetare personalizată" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自定义预设" + } + }, + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إعداد مسبق مخصص" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vlastní předvolba" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Brugerdefineret forudindstilling" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajuste preestablecido personalizado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mukautettu esiasetus" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרה מראש מותאמת" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egyéni előbeállítás" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Programmazione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "カスタムプリセット" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cel Tymczasowy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predefinição personalizada" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пользовательский пресет" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vlastná predvoľba" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anpassad förinställning" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Özel ön ayar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Власний пресет" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cài đặt sẵn tùy chỉnh" + } + } + } + }, + "Custom Preset" : { + "comment" : "The title of the cell indicating a generic custom preset is enabled", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Brugerdefineret forudindstilling" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voreinstellung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajuste Preestablecido personalizado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mukautettu esiasetus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Préréglage personnalisé" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Programmazione" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egendefinert forhåndsinnstilling" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aangepast programma" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cel Tymczasowy" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Presetare personalizată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пользовательский пресет" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anpassad förinställning" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Özel Ön Ayar" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "自定义预设" + } + } + } + }, + "Daily glucose pattern" : { + "comment" : "Accessibility label for the daily glucose pattern (AGP) chart" + }, + "Daily Glucose Pattern" : { + "comment" : "Daily glucose pattern (AGP) section header" + }, + "Date" : { + "comment" : "Date picker label", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "التاريخ" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dato" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Datum" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fecha" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aika" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Date" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "תאריך" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日付" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dato" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Datum" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дата" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dátum" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tid" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tarih" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ngày" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "日期" + } + } + } + }, + "Date Created" : { + "comment" : "Preset sorting option description for sorting by date created" + }, + "Days" : { + "comment" : "A label displayed alongside the days of the week for a glucose alert profile.", + "isCommentAutoGenerated" : true + }, + "dB" : { + "comment" : "The short unit display string for decibles", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "дБ" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "dB" + } + } + } + }, + "decrease" : { + + }, + "Decreased Delivery" : { + + }, + "Delay 1st Alert" : { + + }, + "Delay for" : { + + }, + "Delay the first alert until your reading stays out of range for this long." : { + + }, + "Delete" : { + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حذف" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poista" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחק" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elimina" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slett" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwijderen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usunąć" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apagar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstrániť" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ta bort" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sil" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xóa" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Smazat" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Törlés" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "削除" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Видалити" + } + } + } + }, + "Delete \"%@\"?" : { + "comment" : "A confirmation dialog that appears when the user taps the \"Delete Alert Profile\" button. The text inside the dialog is parameterized with the name of the profile. The argument is the string “”.", + "isCommentAutoGenerated" : true + }, + "Delete “%@”?" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet \"%@\"?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "„ %@ “ löschen?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer \"%@\"?" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "למחוק את \" %@ \"?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminare \"%@\" ?" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slette \"%@\"?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "„%@” verwijderen?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usunąć „ %@ ”?" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți \"%@\"?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除”%@”?" + } + } + } + }, + "Delete Account" : { + "comment" : "The title of the button to remove the credentials for a service", + "extractionState" : "manual", + "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Smazat účet" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet konto" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konto löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminar Cuenta" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poista tili" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer le compte" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחק חשבון" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elimina account" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アカウントを削除" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slett Konto" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwijder account" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usuń konto" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remover Conta" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți cont" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить аккаунт" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstrániť účet" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radera konto" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hesabı sil" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xóa Tài khoản" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除账户" + } + } + } + }, + "Delete Alert Profile" : { + "comment" : "A button that deletes a glucose alert profile.", + "isCommentAutoGenerated" : true + }, + "Delete All" : { + "comment" : "Button title to delete all objects", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet alle" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alle löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminar Todos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poista kaikki" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer tout" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחק הכל" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elimina tutto" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "すべて削除" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slett alle" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwijder alles" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usuń wszystko" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remover Todos" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți tot" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить все" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radera allt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hepsini sil" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xóa hết" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除所有" + } + } + } + }, + "Delete All Testing Data" : { + "comment" : "The title of an alert that lets the user delete all their testing data.", + "isCommentAutoGenerated" : true + }, + "Delete CGM" : { + "comment" : "Button title to delete CGM", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حذف CGM" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet CGM" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminar MCG" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poista CGM" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer le CGM" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחק חיישן" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elimina CGM" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGMを削除" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slett CGM" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwijder CGM" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usuń CGM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remover CGM" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți senzor de glicemie" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить мониторинг" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstrániť CGM" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Radera CGM" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM Sil" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xóa CGM" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除CGM" + } + } + } + }, + "Delete Dose" : { + "comment" : "Button to delete a dose" + }, + "Delete External Insulin" : { + "comment" : "Button to delete a manually-entered insulin dose" + }, + "Delete Food" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet mad" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Essen löschen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer l'aliment" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elimina cibo" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slett mat" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voedingsmiddel verwijderen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usuń jedzenie" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți alimentele" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除食物" + } + } + } + }, + "Delete Service" : { + "comment" : "Button title to delete a service", + "extractionState" : "manual", + "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Smazat službu" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet service" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dienst löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminar servicio" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poista palvelu" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer le service" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחק שירות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elimina servizio" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete Service" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slett tjeneste" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Service verwijderen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usuń usługę" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete Service" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți serviciul" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить сервис" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstrániť službu" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ta bort tjänst" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Servisi Sil" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delete Service" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除服务" + } + } + } + }, + "Delete Testing CGM Data" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet CGM testdata" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM-Test-Daten löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminar prueba de datos CGM" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poista testi-CGM:n tiedot" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effacer les données de test du CGM" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחק נתוני בדיקת חיישן" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elimina dati test CGM" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slett testdata for blodsukkermåler" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwijder test-CGM-gegevens" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usuń testowe dane CGM" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți datele senzorului de test" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить данные тестирования CGM" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ta bort simulerade testvärden från CGM" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Test CGM Verilerini Sil" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除测试 CGM 数据" + } + } + } + }, + "Delete Testing Data" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet testdata" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Test-Daten löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminar datos de prueba" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poista testitiedot" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer les données de Test" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחק נתוני בדיקה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elimina dati test" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slett testdata" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Testgegevens verwijderen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usuń dane testowe" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți datele de testare" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить данные тестирования" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ta bort simulerade testvärden" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Test Verilerini Sil" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除测试数据" + } + } + } + }, + "Delete Testing Pump Data" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slet testdata for pumpe" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpen-Test-Daten löschen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Borrar los datos de prueba de la bomba" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poista testipumpun tiedot" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer les données de la Pompe de test" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מחק נתוני בדיקת משאבה" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Elimina dati test della pompa" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slett data for testpumpe" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Testpompgegevens verwijderen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usuń dane pompy testowej" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ștergeți datele pompei de test" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удалить данные тестирования помпы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ta bort simulerade pumpvärden" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Test Pompası Verilerini Sil" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "删除测试用胰岛素泵数据" + } + } + } + }, + "Delete this dose?" : { + "comment" : "Confirmation title for deleting a dose" + }, + "Delete this manually-entered insulin entry?" : { + "comment" : "Confirmation title for deleting a manually-entered insulin dose" + }, + "Deliver" : { + "comment" : "Button text to deliver a bolus", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afgiv" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abgeben" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entregar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annostele" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administrer" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eroga" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gi bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toedienen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podaj Bolus" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administrați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Подать" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podať" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ge bolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "İlet" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输注" + } + } + } + }, + "Delivery Details" : { + + }, + "Delivery Limits" : { + "comment" : "Title text for delivery limits", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حدود الضخ" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limity podávání" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulingrænser" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abgabelimits" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delivery Limits" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Límites de Administración de Insulina" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annostelurajat" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limites d'Administration" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Delivery Limits" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limiti erogazione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "注入限度" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Leveringsgrenser" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toedieningslimieten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limity podawania" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limites de Entrega" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limite de administrare" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пределы подачи" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limity podávania" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Maxdoser" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "İletim Limitleri" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giới hạn liều tiêm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输注限制" + } + } + } + }, + "Denied" : { + "comment" : "Health sharing status: denied" + }, + "Depending on the activity, you may notice a few common patterns when it comes to your insulin needs:" : { + + }, + "Device Issue" : { + "comment" : "title for when automation is off and there is a device issue" + }, + "Devices" : { + + }, + "Diabetes Treatment" : { + "comment" : "Descriptive text for Therapy Settings", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diabetesbehandling" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diabetes-Behandlung" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tratamiento de la diabetes" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diabeteshoito" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Traitement du diabète" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Terapia" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diabetesbehandling" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diabetesbehandeling" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "w leczeniu cukrzycy" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tratamentul diabetului" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Лечение диабета" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diabetesbehandling" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diyabet Tedavisi" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "糖尿病治疗" + } + } + } + }, + "Did you intend to enter %1$@ grams as the amount of carbohydrates for this meal?" : { + "comment" : "Alert body when entered carbohydrates is greater than threshold (1: entered quantity in grams)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Havde du til hensigt at angive %1$@ gram som mængden af kulhydrater for dette måltid?" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wolltest Du %1$@ Gramm an Kohlenhydraten für diese Mahlzeit eingeben?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Quería introducir %1$@ gramos como cantidad de hidratos de carbono para esta comida?" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aviez-vous l'intention d'entrer %1$@ grammes comme quantité de glucides pour ce repas?" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Intendevi inserire %1$@ grammi come quantità di carboidrati per questo pasto?" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hadde du tenkt å angi %1$@ gram som mengde karbohydrater for dette måltidet?" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Was je van plan om %1$@ gram in te voeren als hoeveelheid koolhydraten voor deze maaltijd?" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czy zamierzałeś wprowadzić %1$@ gramów jako ilość węglowodanów dla tego posiłku?" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ați intenționat să introduceți %1$@ grame drept cantitate de carbohidrați pentru această masă?" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы намеревались ввести %1$@ граммов углеводов для этого блюда?" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bu yemek için karbonhidrat miktarı olarak %1$@ gram girmeyi düşündünüz mü?" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "你确定本餐包含 %1$@ g 碳水吗?" + } + } + } + }, + "Difficulty maintaining exercise or holding a conversation." : { + + }, + "Disables" : { + "comment" : "The action hint of the workout mode toggle button when enabled", + "extractionState" : "stale", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعطيل" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktiverer" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktivieren" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desactivar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poistaa käytöstä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Désactive" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disables" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disattiva" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "無効にする" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktiverer" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uitschakelen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wyłącza" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desativa" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dezactivează" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Отключает" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stänger av" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Devre Dışı" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vô hiệu hóa" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "禁用" + } + } + } + }, + "Dismiss" : { + "comment" : "Default alert dismissal", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تجاهل" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afvis" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schließen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ignorar" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ohita" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fermer" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בטל" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "閉じる" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avvis" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sluiten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rozumiem" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dispensar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anulați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Отклонить" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avfärda" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reddet" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Từ bỏ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "忽略" + } + } + } + }, + "Display colors for glucose" : { + "comment" : "Title for glucose coloring", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Farben für Blutzucker anzeigen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher les couleurs du glucose" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis fargene for glukose." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kleuren tonen voor glucose" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afișați culorile pentru glicemie" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖颜色显示" + } + } + } + }, + "Display Control Options" : { + "comment" : "A section header in the live activity settings view, describing the control options for displaying glucose levels on the live activity screen.", + "isCommentAutoGenerated" : true, + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Optionen zur Anzeigesteuerung" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Options de contrôle de l'affichage" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis kontrollopsjonene" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Weergaveopties" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afișați opțiunile de control" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "显示控制选项" + } + } + } + }, + "Display prediction in plot" : { + "comment" : "Title for prediction line toggle", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "BZ-Vorhersage im Diagramm anzeigen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher la prédiction dans le graphique" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis prognosen i et diagram." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voorspelling tonen in grafiek" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afișați predicția în grafic" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在图中显示预测结果" + } + } + } + }, + "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.", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Es werden bis zu 4 Elemente angezeigt. Die Bezeichnungen werden in Klammern angegeben." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Affiche jusqu'à 4 éléments. La forme abrégée du libellé figure entre parenthèses." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis opp til 4 elementer. Visningsetiketten står i parantes." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toon maximaal 4 items. Het label staat tussen haakjes." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afișați până la 4 elemente. Eticheta de afișare este în paranteze." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最多显示4个项目。括号内为显示标签。" + } + } + } + }, + "Don't Start" : { + "comment" : "Label for do not start preset action on scheduled preset reminder alert\nThe title of the notification action to not start a preset" + }, + "Done" : { + "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hotovo" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Udført" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fertig" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Completado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Valmis" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Terminé" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בוצע" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fine" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ferdig" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voltooid" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gotowe" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gata" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Готово" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hotovo" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Färdig" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tamamlandı" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "完成" + } + } + } + }, + "Dose Summary" : { + "comment" : "Title for card to log dose", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resumé af dosis" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dosisübersicht" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resumen de dosis" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annoksen yhteenveto" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Résumé de la dose" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Riepilogo della dose" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dose sammendrag" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doseersamenvatting" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podsumowanie dawki" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rezumat doză" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сводная информация о дозе" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sammanfattning av dos" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doz Özeti" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "注射量摘要" + } + } + } + }, + "Dose Type" : { + + }, + "Dosing Strategy" : { + "comment" : "The title of the Dosing Strategy section in settings", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dosingstrategi" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dosierungsstrategie" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estrategia de dosificación" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annostelutapa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stratégie de Dosage" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Strategia di dosaggio" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doseringsstrategi" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doseerstrategie" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Strategia dawkowania" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Strategie dozare" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Режим ввода инсулина" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Strategi för insulinbehandling" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dozlama Stratejisi" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "剂量策略" + } + } + } + }, + "Duration" : { + + }, + "Duration exceeds: %1$.1f hours" : { + "comment" : "Override error description: duration exceed max (1: max duration in hours).", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Varigheden overstiger: %1$.1f timer" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dauer überschritten: %1$.1f Stunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La durée dépasse : %1$.1f heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משך זמן חורג: %1$.1f שעות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La durata supera: %1$.1f ore" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Varigheten overskrider: %1$.1f timer" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duur overschrijdt: %1$.1f uur" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czas trwania przekracza: %1$.1f godzin" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Durata depășește: %1$.1f ore" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Продолжительность превышает: %1$.1f часов" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Süre aşıldı: %1$.1f saat" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "持续时间超过: %1$.1f 小时" + } + } + } + }, + "Duration: %@" : { + + }, + "During Preset" : { + "comment" : "Title of a picker view that allows the user to select whether they want to see the data for the preset or the preset plus 6 hours.", + "isCommentAutoGenerated" : true + }, + "During this kind of hard exercise, your body may release hormones that raise glucose. This is more common in the morning before eating." : { + + }, + "Each 1% time in range ≈ 15 minutes." : { + "comment" : "TIR helper" + }, + "Each 5% increase in range is clinically beneficial." : { + "comment" : "TIR suggestion" + }, + "Easy breath. Can carry on a conversation." : { + + }, + "Edit Food" : { + + }, + "Edit Preset" : { + + }, + "Edit presets" : { + + }, + "Enable\nBluetooth" : { + "comment" : "Message to the user to enable bluetooth", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiver \nbluetooth" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth einschalten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activar \nBluetooth" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ota Bluetooth käyttöön" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activer \nbluetooth" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הפעל \n בלוטות'" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attiva\nBluetooth" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiver blåtann" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bluetooth\nInschakelen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Włączać\nBluetooth" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activați\nBluetooth" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Включить\nBluetooth" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivera Bluetooth" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Etkinleştir\nBluetooth" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用蓝牙" + } + } + } + }, + "Enable Glucose Based Partial Application" : { + "comment" : "Title for Glucose Based Partial Application toggle", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivér Glucose Based Partial Application" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucose Based Partial Application aktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permettre l'application partielle basée sur la glycémie" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attiva Applicazione parziale basata sulla glicemia (GBPA)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiver delvis anvendelse basert på glukose" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucose-afhankelijke gedeeltelijke toediening inschakelen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Włącz Algorytm adaptacyjny" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activați aplicarea parțială pe bază de glicemie" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用基于血糖的部分输注" + } + } + } + }, + "Enable Integral Retrospective Correction" : { + "comment" : "Title for Integral Retrospective Correction toggle", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivér Integral Retrospective Correction" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Integral Retrospective Correction aktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activer la correction rétrospective intégrale" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attiva Correzione retrospettiva integrale (IRC)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivere integrert retrospektiv korrigering" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Integrale retrospectieve correctie inschakelen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Włącz Integralną Korektę Retrospektywną (IRC)" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activați corecția retrospectivă integrală" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用整体回溯校正(IRC)" + } + } + } + }, + "Enabled" : { + "comment" : "Title for enable live activity toggle", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiviert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activé" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivert" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingeschakeld" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activat" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用" + } + } + } + }, + "Enables" : { + "comment" : "The action hint of the workout mode toggle button when disabled", + "extractionState" : "stale", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تفعيل" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiverer" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivieren" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permitir" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ottaa käyttöön" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Active" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enables" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Attiva" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "有効にする" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiverer" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inschakelen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Włącza" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ativar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activați" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Включает" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Slår på" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Etkin" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cho phép" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "启用" + } + } + } + }, + "End" : { + + }, + "End Preset" : { + + }, + "End Time" : { + + }, + "End Training?" : { + + }, + "Ensure that notifications are allowed and NOT silenced from %1$@." : { + "comment" : "Focus modes step 4 (1: appName)" + }, + "Enter a blood glucose from a meter for a recommended bolus amount." : { + "comment" : "Caption for bolus screen notice when glucose data is missing or stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indtast blodsukker fra en fingerprikmåling for at få anbefalet en bolusmængde." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gib einen Blutzuckerwert von einem Messgerät ein, um eine Bolusempfehlung zu bekommen." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingrese una glucosa en sangre de un medidor por una cantidad recomendada de bolo." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Syötä sormenpäästä mitattu glukoosiarvo saadaksesi suositellun bolusmäärän." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrez la glycémie à partir d'un mesure manuelle pour le calcul du bolus." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הכנס קריאת מד סוכר כדי לקבל המלצה לכמות בולוס." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inserirsci la glicemia capillare per ottenere la quantità di bolo consigliata." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg inn blodsukkerverdi fra en måler for anbefalt bolusmengde." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verkrijg een bloedglucose waarde van een meter voor een aanbevolen bolus hoeveelheid." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wprowadź poziom glukozy z glukometru, aby uzyskać zalecaną wielkość bolusa." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Introduceți o glicemie luata cu glucometrul pentru o recomandare de bolus." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Введите глюкозу крови, полученную с помощью глюкометра, для получения рекомендуемого количества болюса." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du behöver mata in ett blodsockervärde för att få en rekommenderad bolus." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Önerilen bolus miktarı için bir ölçüm cihazından bir kan şekeri girin." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请输入血糖仪测得的血糖值,以获取推荐的大剂量。" + } + } + } + }, + "Enter Bolus" : { + "comment" : "Button text to begin entering a bolus", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indtast bolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus eingeben" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Introducir bolo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Syötä bolus" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrer un Bolus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inserisci bolo" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skriv inn bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus invoeren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wprowadź bolus" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Introduceți bolusul" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ввести болюс" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ange Bolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus girin" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入大剂量" + } + } + } + }, + "Enter Fingerstick Glucose" : { + "comment" : "Button text prompting manual glucose entry on bolus screen", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indtast fingerprikmåling" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blutzucker eingeben" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingrese la glucosa de punción en el dedo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Syötä mitattu glukoosiarvo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrez la Glycémie capillaire" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הכנס קריאת מד סוכר" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inserirsci glicemia capillare" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg inn blodsukkerverdi fra fingerstikk" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vul vingerprikglucose in" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wprowadź glukozę z glukometru" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Introduceți glicemia din deget" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Введите глюкозу по глюкометру" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ange kapillärt blodsocker" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Parmak Ucu KŞ Girin" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入指尖血糖值" + } + } + } + }, + "Enter glucose safety limit" : { + "comment" : "The placeholder text instructing users to enter a glucose safety limit", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indtast glucosesikkerhedsgrænse" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukosesicherheitsgrenze eingeben" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Introduzca el límite de seguridad de glucosa" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aseta glukoosin turvaraja" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrez la limite de sécurité du taux de glucose" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "הגדרת בטיחות" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inserisci limite di sicurezza glicemia" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Angi sikkerhetsgrensen for blodsukker" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voer glucoseveiligheidslimiet in" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wprowadź bezpieczny limit glukozy" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Introduceți limita de siguranță pentru glicemie" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Введите безопасный предел глюкозы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ange tröskelvärde för blodsocker" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "KŞ güvenlik limitini girin" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入血糖安全下限" + } + } + } + }, + "Enter suspend threshold" : { + "comment" : "The placeholder text instructing users to enter a suspend treshold", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "أدخل حد التوقف" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indtast grænse for suspendering" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Grenzwert für Hypo-Abschaltung eingeben" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enter suspend threshold" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingrese nivel de suspensión" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aseta pysäytysraja" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entrez le seuil de suspension" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enter suspend threshold" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inserisci soglia di sospensione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "一時停止値を入力" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Angi suspenderingsgrense" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voer drempel voor onderbreking in" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wprowadź próg zawieszenia pompy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Digite o limite de suspensão" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Introduceți limita pentru suspendare" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Введите рубеж приостановки" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ange tröskelvärde" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Askıya alma eşiğini girin" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nhập ngưỡng tạm dừng" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输入暂停阈值" + } + } + } + }, + "Error Canceling Bolus" : { + "comment" : "The alert title for an error while canceling a bolus", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "خطأ في إلغاء الجرعة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fejl ved annullering af bolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Abbrechen des Bolus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error de cancelación de bolo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Virhe boluksen kumoamisessa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erreur lors de l’annulation du Bolus" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error Canceling Bolus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errore durante l'annullamento del bolo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ボーラスのキャンセルにエラー" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke avbryte bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fout bij annuleren bolus" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Błąd anulowania bolusa" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erro Cancelando Bolus" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eroare la anularea bolusului" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ошибка отмены болюса" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fel vid försök att avbryta bolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolus İptali Hatası" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lỗi hủy liều Bolus" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无法取消大剂量" + } + } + } + }, + "Error Exporting Logs" : { + "comment" : "Critical event log export error alert title", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der opstod en fejl under eksport af log" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Exportieren des Protokolls" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error al exportar registros" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Virhe lokin viennissä" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erreur lors de l'exportation des journaux" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errore durante l'esportazione dei registri" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Feil ved eksport av logger" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fout bij exporteren logboeken" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Błąd podczas eksportowania dzienników" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eroare la exportarea jurnalelor" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ошибка экспорта логов" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fel vid export av loggar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Günlükleri Dışa Aktarırken Hata" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导出日志发生错误" + } + } + } + }, + "Error Resuming" : { + "comment" : "The alert title for a resume error", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "خطأ في الاستئناف" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fejl ved genoptagelse" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler beim Fortfahren" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error Resuming" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error Reanudando" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Virhe jatkamisessa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erreur lors de la reprise" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Error Resuming" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Errore durante la ripresa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "再開エラー" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Feil ved gjenopptagelse" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fout bij hervatten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Błąd wznawiania" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erro ao Retomar" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eroare în timpul reluării" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ошибка возобновления" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba pri obnovení" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fel vid återupptagande" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sürdürme Hatası" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lỗi khi đang tái thực hiện" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "恢复输注错误" + } + } + } + }, + "Event" : { + + }, + "Event History" : { + "comment" : "Segmented button title for insulin delivery log event history", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hændelseshistorik" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ereignisverlauf" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Historial de Eventos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tapahtumahistoria" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Historique des événements" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Event History" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cronologia degli eventi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Event History" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hendelseshistorie" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Logboek" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Historia zdarzeń" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Event History" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Istoric evenimente" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "История событий" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Händelsehistorik" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Etkinlik Geçmişi" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Event History" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "历史事件" + } + } + } + }, + "Eventually" : { + + }, + "Eventually %@" : { + "comment" : "The subtitle format describing eventual glucose. (1: localized glucose value description)", + "extractionState" : "stale", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "في النهاية %@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Med tiden %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voraussichtlich %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventualmente %@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ennuste %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Éventuellement %@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventually %@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infine %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "予想 %@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Omsider %@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uiteindelijk %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Docelowo %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eventualmente %@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "În cele din urmă %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "В конечном итоге %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Förväntat %@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nihai KŞ %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kết quả %@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "最终 %@" + } + } + } + }, + "Example" : { + + }, + "Example: Allow Notifications from %1$@" : { + "comment" : "Focus mode image 1 caption (1: appName)" + }, + "Example: Silence Notifications from other apps" : { + "comment" : "Focus mode image 2 caption" + }, + "Exceeds maximum allowed bolus in settings" : { + "comment" : "Bolus error description: bolus exceeds maximum bolus in settings.", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overskrider den maksimalt tilladte bolus i indstillingerne" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Überschreitet den maximal zulässigen Bolus in den Einstellungen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Excede el bolo máximo permitido en la configuración" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dépasse le bolus maximal défini dans les paramètres" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supera il bolo massimo consentito nelle impostazioni" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overskrider maksimalt tillatt bolus i innstillingene" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overschrijdt maximale toegestane bolus in instellingen" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przekracza maksymalny dozwolony bolus." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Depășește bolusul maxim permis în setări" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Превышен максимально допустимый болюс в настройках" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ayarlarda izin verilen maksimum bolusu aşıyor" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "超出设定的最大剂量限制" + } + } + } + }, + "Exceeds maximum allowed carbs" : { + "comment" : "Carb error description: carbs exceed maximum amount.", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overskrider det maksimalt tilladte antal kulhydrater" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Überschreitet die maximal zulässigen Kohlenhydrate" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supera el máximo permitido de carbohidratos definido en la configuración" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dépasse le nombre de glucides maximal accepté" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supera i carboidrati massimi consentiti" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overskrider maksimalt tillatte karbohydrater" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overschrijdt maximale toegestane koolhydraten" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przekracza maksymalną dopuszczalną ilość węglowodanów" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Depășește maximul de carbohidrați permis" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Превышено максимально допустимое количество углеводов" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "İzin verilen maksimum karbonhidrat miktarını aşıyor" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "超过最大允许碳水化合物摄入量" + } + } + } + }, + "Exceeds Maximum Bolus" : { + "comment" : "Alert title for a maximum bolus validation error", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يتجاوز أقصى جرعة" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overskrider maksimal bolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Überschreitet den maximalen Bolus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Excede bolo máximo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ylittää maksimiboluksen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dépasse le bolus maximal" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exceeds Maximum Bolus" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supera il bolo massimo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ボーラス最大値を超えています" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overskrider maksimal bolus" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overschrijdt maximale bolus" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Osiągnięto bolus maksymalny" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Excede o Bolus Máximo" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Depășește bolusul maxim" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Превышает максимальный болюс" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Överstiger maxbolusdos" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Maksimum Bolusu Aşıyor" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vượt quá liều Bolus tối đa" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "超过大剂量上限" + } + } + } + }, + "Exercise is a common reason to use a preset. Different kinds of exercise and their intensity levels can affect your glucose levels in different ways." : { + + }, + "Explosive sprints or bursts" : { + + }, + "Export Critical Event Logs" : { + "comment" : "The title of the export critical event logs in support", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksportér kritisk begivenhedslog" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Protokolle kritischer Ereignisse exportieren" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportar registros de eventos críticos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vie tärkeiden tapahtumien loki" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporter les journaux d'événements critiques" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esporta registri eventi critici" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporter kritiske hendelseslogger" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporteer kritieke gebeurtenislogboek" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksportuj dzienniki zdarzeń krytycznych" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportați jurnalul de evenimente critice" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Экспорт логов критических событий" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportera kritiska händelseloggar" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritik Olay Günlüklerini Dışa Aktarma" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导出关键事件日志" + } + } + } + }, + "Export-%1$@" : { + "comment" : "The export file name formatted string (1: timestamp)", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksport-%1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Export-%1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportar- %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vienti-%1$@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Export-%1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esporta- %1$@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporter- %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporteren: %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksportuj- %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportați-%1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Экспорт -%1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportera-%1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dışa Aktar- %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导出-%1$@" + } + } + } + }, + "External Insulin" : { + "comment" : "Dose type label for a manually-entered bolus" + }, + "Failed to Resume Insulin Delivery" : { + "comment" : "The alert title for a resume error", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke genoptage insulintilførsel" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wiederaufnahme der Insulinabgabe fehlgeschlagen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No se pudo reanudar la administración de insulina" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Annostelun jatkaminen epäonnistui" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Échec de la reprise de l’administration d’insuline" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossibile riprendere l'erogazione dell'insulina" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke gjenoppta insulinlevering" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulinetoediening hervatten mislukt" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie udało się wznowić podawania insuliny" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eșec la reluarea administrării de insulină" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Не удалось возобновить подачу инсулина" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnovenie podávania inzulínu zlyhalo" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Misslyckades att återuppta insulintillförsel" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "İnsülin İletimine Devam Edilemedi" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "恢复胰岛素输注失败" + } + } + } + }, + "Falling / Falling Quickly" : { + + }, + "Falling Slowly" : { + + }, + "FAQ about Alerts" : { + "comment" : "View title for how mute alerts work" + }, + "Favorite Food Insights" : { + + }, + "Favorite Foods" : { + "comment" : "Label for Favorite Foods icon in Settings\nTitle for Favorite Foods view", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lieblingsessen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aliments favoris" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מאכלים אהובים" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorittmat" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoriete voedingsmiddelen" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mâncăruri preferate" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "食物库" + } + } + } + }, + "FAVORITE FOODS" : { + "comment" : "The section title for Carb entry screen where Favorite Foods can be selected", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "FAVORIT-MAD" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorisiertes Essen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ALIMENTS FAVORIS" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מאכלים אהובים" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "CIBI SALVATI" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "FAVORITTMAT" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "FAVORIETE ETEN" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "ULUBIONE JEDZENIE" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "MÂNCĂRURI PREFERATE" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "食物库" + } + } + } + }, + "Fiasp" : { + "comment" : "Title of insulin model preset", + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiasp" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "费雅普(Fiasp)" + } + } + } + }, + "Filter" : { + + }, + "Filtered by:" : { + + }, + "Fingerstick Glucose" : { + "comment" : "Label for manual glucose entry row on bolus screen", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fingerprik blodsukker" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blutzucker" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosa de punción en el dedo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mitattu glukoosi" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucose capilaire" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קריאת מד סוכר" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicemia capillare" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blodsukkerverdi fra fingerstikk" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vingerprikglucose" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoza z krwi" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicemie din deget" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Глюкоза по глюкометру" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kapillärt blodsocker" + } + }, + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Permisiuni de alertă și alerte silențioase" + "value" : "Parmak Ucu KŞ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "指尖血糖" + } + } + } + }, + "Fires once when Loop's forecast first dips below the level inside this horizon. Re-arms when the forecast clears." : { + "comment" : "A footer for the \"Horizon\" section of a glucose alert detail view, explaining how the horizon works.", + "isCommentAutoGenerated" : true + }, + "Fix now by turning Critical Alerts and Time Sensitive Notifications ON." : { + "comment" : "Both Critical Alerts and Time Sensitive Notifications disabled banner body" + }, + "Fix now by turning Critical Alerts ON." : { + "comment" : "Critical alerts disabled banner body" + }, + "Fix now by turning Notifications and Critical Alerts ON." : { + "comment" : "Both Critical Alerts and Notifications disabled banner body" + }, + "Fix now by turning Notifications ON." : { + "comment" : "Notifications disabled banner body" + }, + "Fix now by turning Notifications, Critical Alerts and Time Sensitive Notifications ON." : { + "comment" : "Secondary text for alerts disabled warning, which appears on the main status screen.", + "extractionState" : "stale", + "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opravit nyní zapnutím Oznámení, Kritických upozornění a Časově citlivých oznámení." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Løs nu ved at slå meddelelser, kritiske advarsler og tidsfølsomme meddelelser TIL." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Behebe dies jetzt, indem Du Benachrichtigungen, kritische Alarme und zeitkritische Benachrichtigungen einschaltest." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Soluciónalo ahora activando Notificaciones, Alertas Críticas y Notificaciones Sensibles al Tiempo." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrigez-le maintenant en activant les notifications, les alertes critiques et les notifications urgentes." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "תקן כעת ע״י הפעלת התראות, התראות קריטיות והודעות רגישות לזמן" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Risolvilo ora attivando notifiche, avvisi critici e notifiche sensibili al tempo." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiks nå ved å slå PÅ varsler, kritiske varsler og tidssensitive varsler." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Los nu op door Meldingen, Kritieke meldingen en Tijdgevoelige meldingen AAN te zetten." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Napraw teraz, włączając powiadomienia, alerty krytyczne i powiadomienia zależne od czasu." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remediați acum activând Notificări, Alerte critice și Notificări urgente." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Исправьте ситуацию, включив уведомления, критические оповещения и уведомления, чувствительные к времени." + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bildirimleri, Kritik Uyarıları ve Zamana Duyarlı Bildirimleri AÇIK konuma getirerek şimdi düzeltin." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "请立即开启“通知”、“重要警报”和“时效性通知”以解决问题。" + } + } + } + }, + "Fix now by turning Time Sensitive Notifications ON." : { + "comment" : "Time sensitive notifications disabled banner body" + }, + "Food Type" : { + "comment" : "Label for food type entry on add favorite food screen", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Food Type" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Madtype" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Essenstyp" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Food Type" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Food Type" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Type d'aliment" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "סוג מאכל" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tipo cibo" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Type mat" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Type voeding" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rodzaj żywności" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Food Type" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tip aliment" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тип еды" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Typ jedla" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Typ av mat" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Food Type" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loại thực phẩm" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "食物类型" + } + } + } + }, + "For %1$@" : { + "comment" : "The format string used to describe a finite workout targets duration", + "extractionState" : "stale", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لمدة %1$@" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "I %1$@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Für %1$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Por %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ ajaksi" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pendant %1$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "For %1$@" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@につき" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "For %1$@" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voor %1$@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Do %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Por %1$@" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pentru %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "В течение %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "I %1$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ için" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "For %1$@" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "对于 %1$@" + } + } + } + }, + "For activities that raise your risk of going low, you can set a higher temporary correction range." : { + + }, + "For mixed-intensity activity:" : { + + }, + "For safety purposes, you should allow Critical Alerts, Time Sensitive and Notification Permissions (non-critical alerts) on your device to continue using %1$@ and cannot turn off individual alarms." : { + "comment" : "Description text for silencing time sensitive and non-critical alerts (1: app name)", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Af sikkerhedsmæssige årsager bør du tillade, at Kritiske advarsler, Tidsfølsomme og Meddelelser (ikke-kritiske advarsler) på din enhed fortsætter med at bruge %1$@ og ikke kan slå individuelle alarmer fra." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aus Sicherheitsgründen solltest Du kritische Warnungen, zeitkritische Warnungen und Benachrichtigungsberechtigungen (nicht kritische Warnungen) auf Deinem Gerät zulassen, um %1$@ weiterhin verwenden zu können." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pour des raisons de sécurité, vous devriez autoriser les alertes critiques, les alertes urgentes et les autorisations de notification (alertes non-critiques) sur votre appareil pour continuer à utiliser %1$@ si vous ne pouvez pas désactiver les alarmes individuelles." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per motivi di sicurezza, dovresti consentire gli avvisi critici, gli avvisi sensibili al tempo e le autorizzazioni di notifica (avvisi non critici) sul tuo dispositivo per continuare a utilizzare %1$@ e non puoi disattivare i singoli allarmi." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Av sikkerhetshensyn bør du tillate at kritiske varsler, tidssensitive varsler og varslingstillatelser (ikke-kritiske varsler) på enheten din fortsetter å bruke %1$@ og ikke kan slå av individuelle alarmer." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voor je veiligheid moet je Kritieke meldingen, Tijdgevoelige meldingen en Meldingen (niet-kritieke waarschuwingen) op je apparaat toestaan om %1$@ te blijven gebruiken. Je kunt afzonderlijke alarmen niet uitschakelen." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ze względów bezpieczeństwa należy zezwolić na alerty krytyczne, alerty zależne od czasu i uprawnienia do powiadomień (alerty niekrytyczne) na swoim urządzeniu na dalsze korzystanie z %1$@ i nie można wyłączać poszczególnych alarmów." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "În scopuri de siguranță, trebuie să permiteți alertele critice, urgente și permisiunile de notificare (alerte necritice) pe dispozitivul dumneavoastră pentru a continua să utilizați %1$@ și nu puteți dezactiva alarmele individuale." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "В целях безопасности вам следует разрешить критические оповещения, срочные оповещения и уведомления (некритические оповещения) на вашем устройстве, чтобы продолжить использовать %1$@ и не отключать отдельные тревоги." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "出于安全考虑,您应允许设备上的“关键警报”、“时效性警报”和“通知权限”(非关键警报),以便继续使用 %1$@ ,且无法关闭单个警报。" + } + } + } + }, + "For some people, routine chores and everyday activities can affect glucose levels similar to exercise." : { + + }, + "For these activities, consider setting your insulin needs to **less than 100%**." : { + + }, + "For these activities, consider setting your insulin needs to **more than 100%**." : { + + }, + "Forecasted blood glucose may still be higher than target range." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forventet blodsukker kan stadig være højere end målområdet." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der prognostizierte Blutzucker kann immer noch über dem Zielbereich liegen." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La glucosa en sangre pronosticada aún puede estar por encima del rango objetivo." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le taux de glucose sanguin prévu pourrait quand-même être plus élevé que la plage cible." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "רמת הסוכר הצפויה עשויה עדיין להיות גבוהה מטווח היעד." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La glicemia prevista potrebbe essere più elevata di quella impostata come obiettivo." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forventet blodsukker kan fortsatt være høyere enn målområdet." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voorspelde bloedglucose kan nog steeds hoger zijn dan het streefbereik." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prognozowany poziom glukozy we krwi może nadal być wyższy niż zakres docelowy." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicemia prognozată poate fi în continuare mai mare decât intervalul țintă." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прогнозируемый уровень глюкозы в крови все еще может быть выше целевого диапазона." } }, - "ru" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Разрешения на оповещения и отключение звука оповещений" + "value" : "Öngörülen KŞ, hala hedef aralıktan yüksek olabilir." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "警报权限与静音设置" + "value" : "预测的血糖值可能仍高于目标范围。" } } } }, - "Alert Profiles" : { - "comment" : "A header label for the list of alert profiles.", - "isCommentAutoGenerated" : true - }, - "Alerts" : { - "comment" : "The title of the view.", - "isCommentAutoGenerated" : true - }, - "Algorithm Experiments" : { - "comment" : "Navigation title for algorithms experiments screen\nThe title of the Algorithm Experiments section in settings", + "Forecasted Glucose" : { + "comment" : "Title for forecast explanation modal on bolus view", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritme-eksperimenter" + "value" : "Forventet blodsukker" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Algorithmus-Experimente" + "value" : "Prognostizierte Blutzucker" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosa pronosticada" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Essais d'algorithmes" + "value" : "Glycémie prévue" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "ניסויי אלגוריתמים" + "value" : "סוכר צפוי" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Esperimenti algoritmo" + "value" : "Glicemia prevista" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritmeeksperimenter" + "value" : "Forventet blodsukker" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritme experimenten" + "value" : "Voorspelde glucose" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Algorytmy Eksperymentalne" + "value" : "Prognozowana glukoza" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Experimente algoritmice" + "value" : "Glicemia prognozată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прогнозируемый уровень глюкозы" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tahmini KŞ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "算法实验" + "value" : "预测血糖值" } } } }, - "Algorithm Experiments are optional modifications to the Loop Algorithm. These modifications are less tested than the standard Loop Algorithm, so please use carefully." : { - "comment" : "Algorithm Experiments description.", + "Frequently asked questions about alerts" : { + "comment" : "Label for link to see frequently asked questions", + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritmeeksperimenter er valgfrie ændringer af Loop-algoritmen. Disse ændringer er mindre testet end standard Loop-algoritmen, så brug venligst omhyggeligt." + "value" : "Ofte stillede spørgsmål om påmindelser" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Algorithmus-Experimente sind optionale Modifikationen des Loop-Algorithmus. Diese Modifikationen sind weniger getestet als der Standard-Loop-Algorithmus. Verwende sie daher mit Vorsicht." + "value" : "Häufig gestellte Fragen zu Benachrichtigungen" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Les essais d'algorithme sont des modifications optionnelles de l'algorithme Loop. Ces modifications sont moins testées que l'algorithme Loop standard, alors veuillez les utiliser avec précaution." + "value" : "Foire aux questions sur les alertes" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Gli esperimenti sull'algoritmo sono modifiche opzionali all'algoritmo di Loop. Queste modifiche sono meno testate rispetto all'algoritmo Loop standard, quindi utilizzale con attenzione." + "value" : "Domande frequenti sugli avvisi" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritmeeksperimenter er valgfrie modifikasjoner til Loop-algoritmen. Disse modifikasjonene er mindre testet enn standard Loop-algoritmen, så vær vennlig å bruke dem med forsiktighet." + "value" : "Ofte stilte spørsmål om varsler" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritme-experimenten zijn optionele aanpassingen aan het Loop-algoritme. Deze aanpassingen zijn minder grondig getest dan het standaard Loop-algoritme, dus gebruik ze voorzichtig." + "value" : "Veelgestelde vragen over waarschuwingen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Eksperymenty algorytmiczne to opcjonalne modyfikacje algorytmu pętli. Te modyfikacje są mniej przetestowane niż standardowy algorytm pętli, więc używaj ich ostrożnie." + "value" : "Często zadawane pytania dotyczące alertów" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Experimentele algoritmice sunt modificări opționale ale algoritmului de buclă. Aceste modificări sunt mai puțin testate decât algoritmul de buclă standard, așa că vă rugăm să le utilizați cu atenție." + "value" : "Întrebări frecvente privind alertele" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Часто задаваемые вопросы об оповещениях" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "算法实验是对 Loop 算法的可选调整。这些调整的测试程度低于标准算法,请谨慎启用。" + "value" : "关于警报的常见问题" } } } }, - "Algorithm Settings" : { - "comment" : "The title of the section containing algorithm settings", - "extractionState" : "manual", + "Full out effort. No conversation possible." : { + + }, + "g" : { + "comment" : "The short unit display string for grams", + "extractionState" : "stale", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Indstillinger for algoritme" + "value" : "g" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Algorithmus-Einstellungen" + "value" : "g" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ajustes de Algoritmo" + "value" : "g" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritmin asetukset" + "value" : "g" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Paramètres de l'algorithme" + "value" : "g" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Algorithm Settings" + "value" : "g" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Impostazioni algoritmo" + "value" : "g" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritmeinnstillinger" + "value" : "g" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritme-instellingen" + "value" : "g" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Ustawienia algorytmu" + "value" : "g" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Setări algoritm" + "value" : "g" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Настройки алгоритма" + "value" : "г" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritminställningar" + "value" : "g" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Algoritma Ayarları" + "value" : "gr" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "算法设置" + "value" : "克" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "g" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "г" } } } }, - "All Alerts Muted" : { - "comment" : "Warning text for when alerts are muted", + "Get help with Alert Permissions" : { + "comment" : "Get help with Alert Permissions support button text", "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Alle alarmer er slået fra" + "value" : "Få hjælp til advarselstilladelser" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Alle Warnungen stummgeschaltet" + "value" : "Hol Dir Hilfe zu den Benachrichtigungsberechtigungen" } }, - "fr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Toutes les alertes sont en sourdine" + "value" : "Ayuda con los Permisos de Alerta" } }, - "he" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "כל ההתראות משותקות" + "value" : "Obtenir de l'aide avec les autorisations d'alerte" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tutti gli avvisi disattivati" + "value" : "Ottieni assistenza per le autorizzazioni" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Alle varsler er dempet" + "value" : "Få hjelp med varslingsinnstillinger" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Alle waarschuwingen gedempt" + "value" : "Krijg hulp bij toestemming meldingen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wszystkie alerty wyciszone" + "value" : "Uzyskaj pomoc dotyczącą uprawnień alertów" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Toate alertele sunt dezactivate" + "value" : "Obțineți ajutor cu permisiunile de alertă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Справка по разрешениям на оповещения" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uyarı İzinleri ile ilgili yardım alın" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "所有警报已静音" + "value" : "获取有关警报权限的帮助" } } } }, - "All alerts muted until" : { - "comment" : "Label for when mute alert will end", - "extractionState" : "stale", + "Get help with iOS Permissions" : { + "comment" : "Get help with iOS Permissions support button text" + }, + "Glucose" : { + "comment" : "Health access row label for glucose\nThe title of the glucose and prediction graph\nTitle for predicted glucose chart on bolus screen", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قراءات السكر" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukóza" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Alle advarsler er slået fra indtil" + "value" : "Glukose" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Alle Alarme stummgeschaltet bis" + "value" : "Blutzucker" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucosa" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoosi" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Toutes les alertes auditives sont désactivées jusqu'à" + "value" : "Glycémie" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "כל ההתראות מושתקות עד" + "value" : "Glucose" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tutti gli avvisi disattivati fino a" + "value" : "Glicemia" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖値" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Alle varsler er dempet inntil" + "value" : "Blodsukker" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Alle waarschuwingen gedempt tot" + "value" : "Glucose" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wszystkie alerty wyciszono do" + "value" : "Glukoza" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicose" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Toate alertele sunt dezactivate până la" + "value" : "Glicemia" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Глюкоза" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glykémia" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukos" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kan şekeri" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đường huyết" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "所有警报均已静音,直至……" + "value" : "血糖" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glükóz" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Глюкоза" } } } }, - "All App Sounds Muted" : { - "comment" : "Warning text for when alerts are muted" - }, - "All app sounds, including sounds for all critical alerts such as Urgent Low, Sensor Fail, Pump Expiration, and others will NOT sound." : { - "comment" : "Warning label that all alerts will not sound" - }, - "All app sounds, including sounds for all critical alerts, are currently muted.\n\nTap Unmute to resume app sounds for your alerts." : { - "comment" : "The alert body for unmute alert confirmation" - }, - "All Events" : { - + "Glucose Alerts" : { + "comment" : "A link in the alert management screen that takes the user to the glucose alert settings view.", + "isCommentAutoGenerated" : true }, - "All Favorites" : { - "comment" : "section header for list of existing FavoriteFoods", + "Glucose Based Partial Application" : { + "comment" : "Title for glucose based partial application experiment description\nTitle of glucose based partial application experiment", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Alle favoritter" + "value" : "Glucose Based Partial Application" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Alle Favoriten" + "value" : "Teilweise Anwendung auf Glukosebasis" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tous les favoris" + "value" : "Application partielle basée sur la glycémie" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tutti i preferiti" + "value" : "Applicazione parziale basata sulla glicemia (GBPA)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Alle favoritter" + "value" : "Partiell anvendelse basert på glukosenivå" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Alle favorieten" + "value" : "Glucose-afhankelijke gedeeltelijke toediening" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wszystkie ulubione" + "value" : "Algorytm adaptacyjny" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Toate favoritele" + "value" : "Aplicare parțială pe bază de glicemie" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "全部常用" + "value" : "基于血糖的部分输注" } } } }, - "All Out" : { - - }, - "All Presets" : { + "Glucose Change Chart" : { }, - "Allowed" : { - "comment" : "Health sharing status: authorized" - }, - "Also alert from Loop" : { - "comment" : "A toggle that lets the user enable or disable Loop's alerts for a specific profile.", - "isCommentAutoGenerated" : true - }, - "Amount Consumed" : { - "comment" : "Label for carb quantity entry row on carb entry screen", + "Glucose data is %1$@ old" : { + "comment" : "The error message when glucose data is too old to be used. (1: glucose data age in minutes)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قراءات السكر منذ %1$@ " + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Forbrugt mængde kulhydrater" + "value" : "Blodsukkerdata er %1$@ gamle" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "KH-Menge gegessen" + "value" : "Blutzuckerdaten sind %1$@ alt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Los datos de glucosa son de hace %1$@ " + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoositieto on %1$@ vanha" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Quantité consommée" + "value" : "Les dernières données de glucose remontent à %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "כמות שנצרכה" + "value" : "Glucose data is %1$@ old" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Quantità consumata" + "value" : "I dati sulla glicemia sono vecchi di %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "血糖データは %1$@ 前のものです" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Mengde karbohydrater\n(Mengde inntatt)" + "value" : "Blodsukkerdata er %1$@ gammel" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Gegeten hoeveelheid" + "value" : "Glucosegegevens zijn %1$@ oud" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Ilość węglowodanów" + "value" : "Dane o glukozie są nieaktualne od %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medida de glicose está %1$@ atrasada" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Cantitate consumată" + "value" : "Datele despre glicemie au o vechime de %1$@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Данные о глюкозе устарели на %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukosvärde är %1$@ gammalt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ eski KŞ verisi" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dữ liệu đường huyết %1$@ cũ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "摄入量" + "value" : "葡萄糖%1$@分钟未更新" } } } }, - "Amplitude" : { - "comment" : "The title of the Amplitude service", - "extractionState" : "manual", + "Glucose data not available" : { + "comment" : "Description of error when glucose data is missing", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "قراءات السكر غير متوفرة" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Blodsukkerdata ikke tilgængelige" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Amplitude" + "value" : "Blutzuckerdaten nicht verfügbar" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Los datos de glucosa no están disponibles" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Glukoositietoja ei saatavilla" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Les données de glucose ne sont pas disponibles" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Glucose data not available" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Ampiezza" + "value" : "Dati sulla glicemia non disponibili" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "グルコースデータがありません" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Blodsukkerdata er utilgjengelig" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Glucosegegevens niet beschikbaar" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Amplituda" + "value" : "Dane o glukozie są niedostępne" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Medida de glicose não disponível" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Nu sunt disponibile date despre glicemie" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Данные гликемии недоступны" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Glukosvärde saknas" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "KŞ verisi mevcut değil" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "Dữ liệu đường huyết không sẵn sàng" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Amplitude" + "value" : "血糖数据不可用" } } } }, - "An active override is modifying your carb ratio and insulin sensitivity. If you don't want this to affect your bolus calculation and projected glucose, consider turning off the override." : { - "comment" : "Warning to ensure the carb entry is accurate during an override", + "Glucose Data Now Available" : { + "comment" : "Alert title when glucose data returns while on bolus screen", "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "En aktiv Override ændrer dit kulhydratforhold og din insulinfølsomhed. Hvis du ikke ønsker, at dette skal påvirke din bolusberegning og dit forventede glukose, kan du overveje at slå Override fra." + "value" : "Blodsukkerdata er nu tilgængelige" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Eine aktive Voreinstellung verändert Dein Kohlenhydratverhältnis und Deine Insulinempfindlichkeit. Wenn Du nicht möchtest, dass sich dies auf Deine Bolusberechnung und Deinen prognostizierten Blutzucker auswirkt, solltest Du die Voreinstellung deaktivieren." + "value" : "Blutzucker jetzt verfügbar" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Un Ajuste Temporal activo modifica la proporción de carbohidratos y la sensibilidad a la insulina. Si no deseas que esto afecte el cálculo del bolo y la glucosa proyectada, considera desactivar el Ajuste Temporal." + "value" : "Datos de glucosa ahora disponibles" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoositiedot nyt saatavilla" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Un ajustement actif modifie votre ratio de glucides et votre sensibilité à l'insuline. Si vous ne voulez pas que cela affecte le calcul du bolus et votre glycémie projetée, envisagez de désactiver l'ajustement." + "value" : "Les données de glycémie sont maintenant disponibles" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Un Override attivo sta modificando il rapporto di carboidrati e la sensibilità insulina. Se non si vuole che questo influisca sul calcolo del bolo e sulla glicemia prevista, si consiglia di disattivare la funzione di Override." + "value" : "Dati glicemia ora disponibili" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "En aktiv overstyring modifiserer ditt karbohydratforhold og insulinfølsomhet. Hvis du ikke vil at dette skal påvirke bolusberegningen og projisert blodsukker, bør du vurdere å slå av overstyringen." + "value" : "Blodsukkerdata er utilgjengelig" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Een actieve override wijzigt je koolhydraatratio en je insulinegevoeligheid. Als je niet wilt dat dit je bolusberekening en voorspelde glucose beïnvloedt, kun je overwegen de override uit te schakelen." + "value" : "Glucosegegevens nu beschikbaar" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Aktywny Cel Tymczasowy (Override) modyfikuje stosunek węglowodanów i wrażliwość na insulinę. Jeśli nie chcesz, aby wpłynęło to na obliczenie bolusa i przewidywaną glikemię, rozważ wyłączenie Celu Tymczasowego." + "value" : "Dane dotyczące glukozy są już dostępne" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "O suprascriere activă a schimbat raportul dintre carbohidrați și insulină cât și sensibilitatea la insulină. Dacă nu doriți ca acest lucru să vă afecteze calculul bolusului și gllicemia prognozată, luați în considerare dezactivarea suprascrierii." + "value" : "Valorile glicemiei sunt disponibile" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Активные временные цели изменяют соотношение углеводов и чувствительность к инсулину. Если вы не хотите, чтобы это влияло на расчет болюса и прогнозируемый уровень глюкозы, отключите эту функцию." + "value" : "Данные о глюкозе теперь доступны" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Blodglukosvärde finns nu tillgängligt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Aktif bir geçersiz kılma, karbonhidrat oranınızı ve insülin duyarlılığınızı değiştiriyor. Bunun bolus hesaplamanızı ve öngörülen glikozu etkilemesini istemiyorsanız geçersiz kılmayı kapatmayı düşünün." + "value" : "KŞ Verileri Artık Kullanılabilir" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "当前启用的覆盖设置正在修改您的碳水比和胰岛素敏感系数。\n如果您不希望其影响大剂量的计算和预测血糖,请考虑关闭该覆盖设置。" + "value" : "现已获取血糖数据" } } } }, - "An error occurred while trying to save your carb entry." : { - "comment" : "Alert message for a carb entry persistence error", + "Glucose effect of suspending insulin delivery" : { + "comment" : "Description of the prediction input effect for suspension of insulin delivery", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Der opstod en fejl under forsøget på at gemme kulhydratindtastning." + "value" : "Glukoseeffekt ved afbrydelse af insulintilførsel" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Beim Speichern Deiner Eingabe der Kohlenhydrate ist ein Fehler aufgetreten." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Se produjo un error al intentar guardar la entrada de carbohidratos." - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Virhe hiilihydraattien tallennuksessa." + "value" : "Glukoseeffekt der Unterbrechung der Insulinabgabe" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Une erreur est survenue lors de l'enregistrement de votre saisie manuelle de glucides." + "value" : "Effet sur la glycémie de la suspension d'administration de l'insuline" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Si è verificato un errore durante il tentativo di salvare l'inserimento dei carboidrati." + "value" : "Effetto sulla glicemia della sospensione dell'erogazione d'insulina" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Det oppstod en feil under forsøk på å lagre karbohydratregistreringen." + "value" : "Glukoseeffekt av å suspendere insulintilførsel" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Er is een fout opgetreden tijdens het opslaan van je koolhydraatinvoer." + "value" : "Glucose-effect van onderbroken insulinetoediening" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wystąpił błąd podczas próby zapisania wpisu dotyczącego węglowodanów." + "value" : "Wpływ wstrzymania podawania insuliny na poziom glukozy" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Eroare la încercarea de salvare a carbohidraților." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Произошла ошибка при попытке сохранить запись об углеводах." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ett fel uppstod när du skulle spara dina kolhydrater." - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Karbonhidrat girişinizi kaydetmeye çalışırken bir hata oluştu." + "value" : "Efectul asupra glicemiei al suspendării administrării de insulină" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "保存碳水记录时出错了。" + "value" : "暂停胰岛素输注对血糖的影响" } } } }, - "An error occurred while trying to save your manual glucose entry." : { - "comment" : "Alert message for a manual glucose entry persistence error", + "Glucose Entry Out of Range" : { + "comment" : "Alert title for a manual glucose entry out of range error\nTitle for bolus screen warning when glucose entry is out of range", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Der opstod en fejl under forsøget på at gemme en manuel blodsukkerindtastning." + "value" : "Blodsukkerværdi er uden for intervallet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Beim Speichern Deines manuell eingegebenen Blutzuckers ist ein Fehler aufgetreten." + "value" : "Blutzucker-Eingabe außerhalb des Bereichs" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Se produjo un error al intentar guardar la entrada manual de glucosa." + "value" : "Entrada de glucosa fuera de rango" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Virhe glukoosiarvon tallennuksessa." + "value" : "Glukoosiarvo alueen ulkopuolella" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Une erreur est survenue lors de l'enregistrement de votre saisie manuelle de glycémie." + "value" : "La glycémie saisie est hors de la plage." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Si è verificato un errore durante il tentativo di salvare l'inserimento manuale della glicemia." + "value" : "Glicemia inserita fuori intervallo" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Det oppstod en feil under forsøk på å lagre den manuelle BS-registreringen." + "value" : "Blodsukkerdata er utenfor intervallet" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Er is een fout opgetreden tijdens het opslaan van je handmatige glucose-invoer." + "value" : "Glucose-invoer buiten bereik" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wystąpił błąd podczas próby zapisania ręcznego wpisu o glukozie." + "value" : "Wprowadzanie glukoza jest poza zakresem" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Eroare la încercarea de salvare a glicemiei introduse manual." + "value" : "Valoarea glicemiei introdusă este în afara intervalului" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Произошла ошибка при попытке сохранить данные о глюкозе, введенные вручную." + "value" : "Ввод глюкозы вне допустимого диапазона" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ett fel uppstod när du skulle spara ditt blodsockervärde." + "value" : "Det manuellt inmatade blodsockervärdet utanför gränsvärden" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Manuel KŞ girişinizi kaydetmeye çalışırken bir hata oluştu." + "value" : "KŞ Girişi Aralık Dışında" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在尝试保存您手动输入的血糖值时发生错误。" + "value" : "输入血糖超出范围" } } } }, - "An unexpected onboarding error state occurred." : { - "comment" : "Invalid onboarding state", + "Glucose Metrics" : { + "comment" : "Glucose metrics section header" + }, + "Glucose Momentum" : { + "comment" : "Title of the prediction input effect for glucose momentum", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مقاومة سكر الدم" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Der er opstået en uventet fejltilstand i forbindelse med onboarding." + "value" : "Blodsukkermomentum" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ein unerwarteter Fehlerstatus beim Onboarding ist aufgetreten." + "value" : "Blutzucker-Momentum" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Se ha producido un error inesperado" + "value" : "Momento de Glucosa" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukoosin liike" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Un état d'erreur innatendu a eu lieu durant le processus d'intégration" + "value" : "Momentum de glucose" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glucose Momentum" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Si è verificato un errore di onboarding imprevisto." + "value" : "Momento della glicemia" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "グルコース モメンタム" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "En uventet onboarding-feiltilstand oppstod." + "value" : "Glukose Momentum" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Er is een onverwachte onboarding-foutstatus opgetreden" + "value" : "Glucosetrendlijn" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Niespodziewany błąd wdrażania" + "value" : "Pęd glukozy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aceleração da Glicose" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "A apărut o eroare neașteptată de stare la inițiere." + "value" : "Avânt glicemie" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Возникла непредвиденная ошибка подключения." + "value" : "Динамика гликемии" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukosförändring" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Beklenmeyen bir ekleme hatası durumu oluştu." + "value" : "KŞ Momentumu" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chuyển động của Glucose" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "初始化向导发生意外错误状态" + "value" : "葡萄糖增量预测算法" } } } }, - "An updated bolus recommendation is available." : { - "comment" : "Alert message when glucose data returns while on bolus screen", - "extractionState" : "stale", + "Glucose overview and ambulatory glucose profile" : { + "comment" : "Statistics settings descriptive text" + }, + "Glucose Summary" : { + + }, + "Glucose Target Range Schedule" : { + "comment" : "Details for configuration error when glucose target range schedule is missing", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "En opdateret bolusanbefaling er tilgængelig." + "value" : "Tidsplan for glukosemålområde" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Eine aktualisierte Bolusempfehlung ist verfügbar." + "value" : "Zeitplan für den Blutzucker-Zielbereich" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Hay una recomendación actualizada de bolo." - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Päivitetty bolussuositus on saatavilla." + "value" : "Horario para el objetivo de glucosa" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Une recommandation de bolus mise à jour est disponible." + "value" : "Horaire de la plage cible de glycémie" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "È disponibile una raccomandazione aggiornata sul bolo." + "value" : "Programma di intervalli target di glicemia" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "En oppdatert bolusanbefaling er tilgjengelig." + "value" : "Tidsplan for blodsukker målområde" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Een bijgewerkte aanbevolen bolus is beschikbaar." + "value" : "Glucosestreefbereikschema" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dostępna jest zaktualizowana rekomendacja bolusa." + "value" : "Harmonogram zakresu docelowego glukozy" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Este disponibilă o recomandare de bolus nouă." + "value" : "Programul intervalului țintă de glicemie" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Доступна обновленная рекомендация болюса." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Det finns nu en ny bolusrekommendation." + "value" : "График целевого диапазона глюкозы" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Güncellenmiş bir bolus önerisi mevcuttur." + "value" : "KŞ Hedef Aralığı Programı" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "有新的大剂量推荐值可用" + "value" : "血糖目标范围表" } } } }, - "API Key" : { - "comment" : "The title of the amplitude API key credential", - "extractionState" : "manual", + "Glucose, Insulin, and Carb Data Access" : { + "comment" : "Apple Health settings descriptive text" + }, + "GMI" : { + "comment" : "Glucose Management Indicator metric title", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "API nøgle" + "value" : "GMI" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "API-avain" + "value" : "GMI" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Clé API" + "value" : "GMI" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "GMI" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Chiave API" + "value" : "GMI" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "API キー" + "value" : "GMI" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "API Nøkkel" + "value" : "GMI" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "API sleutel" + "value" : "GMI" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Cheie API" + "value" : "GMI" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "API-ключ" + "value" : "GMI" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Kľúč API" + "value" : "GMI" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "API Anahtarı" + "value" : "GMI" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "GMI" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "API Key" + "value" : "GMI" } } } }, - "API Secret" : { - "comment" : "The title of the nightscout API secret credential", - "extractionState" : "manual", + "Health" : { + "comment" : "Logbook carb row detail: the entry came from Apple Health", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "Health" } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "Zdraví" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "API kodeord" + "value" : "Sundhed" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "API Secret" + "value" : "Health" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Clave secreta API" + "value" : "Salud" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "API-salasana" + "value" : "Terveys" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Secret API" + "value" : "Santé" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "Health" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egészség" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Chiave personale API" + "value" : "Salute" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "APIシークレット" + "value" : "ヘルスケア" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "API Hemmelighet" + "value" : "Helse" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "Gezondheid" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "Zdrowie" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Chave API" + "value" : "Saúde" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Secretul API" + "value" : "Sănătate" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "API Секрет" + "value" : "Здоровье" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "Zdravie" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "Hälsa" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "Health" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Здоровʼя" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "Apple Health" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "API Secret" + "value" : "健康" } } } }, - "App Profile" : { - "comment" : "Settings app profile section", + "Go to Settings > Focus." : { + "comment" : "Focus modes step 1" + }, + "Goal: <%@" : { + "comment" : "Average glucose goal" + }, + "Goal: <1%" : { + "comment" : "TIR goal for very low" + }, + "Goal: <5%" : { + "comment" : "TIR goal for very high" + }, + "Goal: <7%" : { + "comment" : "GMI goal" + }, + "Goal: >70%" : { + "comment" : "CGM active goal\nTIR goal for target range" + }, + "Goal: ≤36%" : { + "comment" : "Glucose variability goal" + }, + "grams" : { + + }, + "HARDWARE SOUNDS" : { + "extractionState" : "stale", "localizations" : { - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profil" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "App-profil" + "value" : "HARDWARE-LYDE" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "App-Profil" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Perfil de la aplicación" + "value" : "HARDWARE-SOUNDS" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Profil de l'application" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "פרופיל אפליקציה" + "value" : "SONS MATÉRIELS" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Profilo app" + "value" : "SUONI HARDWARE" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "App-profil" + "value" : "MASKINVARELYDER" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "App-Profiel" + "value" : "GELUIDEN VAN APPARATUUR" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Profil aplikacji" + "value" : "DŹWIĘKI SPRZĘTOWE" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Profilul aplicației" + "value" : "SUNETE HARDWARE" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Профиль приложения" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uygulama Profili" + "value" : "АППАРАТНЫЕ ЗВУКИ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "应用配置" + "value" : "泵体提示音" } } } }, - "App Store" : { - "comment" : "Button title to open the App Store for a required update" + "Her bolus recommendation is higher than usual because her overall insulin is set higher." : { + }, - "Apple" : { - "comment" : "Default name on add favorite food screen", + "Her preset is set to **110%%**, which is more than she usually needs. This means %@ will make her basal rates, carb ratio, and insulin sensitivity factor (ISF) stronger. " : { + + }, + "High" : { + "comment" : "Time-in-range band label (181–250 mg/dL)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مرتفع" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vysoká" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Høj" + } + }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Apfel" + "value" : "Hoch" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alta" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Korkea" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Pomme" + "value" : "Élevée" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "תפוח" + "value" : "גבוה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Magas" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Mela" + "value" : "Alta" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "高値" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Eple" + "value" : "Høy" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Appel" + "value" : "Hoog" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wysoka" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alta" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Apple" + "value" : "Ridicată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Высокая" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vysoká" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Högt" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yüksek" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Висока" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cao" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "苹果" + "value" : "高" } } } }, - "Apple Health" : { - "comment" : "Apple Health settings button text\nTitle of the Apple Health access screen" - }, - "Are you sure you want to delete all history entries?" : { - "comment" : "Action sheet confirmation message for pump history deletion", + "In range" : { + "comment" : "Time in range band: glucose 70–180 mg/dL (3.9–10.0 mmol/L) Time-in-range band name: glucose 70–180 mg/dL (3.9–10.0 mmol/L)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "ضمن النطاق" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "V rozsahu" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på at du vil slette alle gamle indtastninger?" + "value" : "I området" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Möchtest Du wirklich alle Verlaufseinträge löschen?" + "value" : "Im Zielbereich" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "¿Estás seguro de querer eliminar todos las entradas históricas?" + "value" : "En rango" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Haluatko varmasti poistaa kaikki historiatiedot?" + "value" : "Tavoitealueella" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Voulez-vous vraiment supprimer toutes les entrées de l’historique?" + "value" : "Dans la cible" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בטוח שברצונך למחוק את כל ערכי ההיסטוריה?" + "value" : "בטווח" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tartományban" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Sei sicuro di voler eliminare tutte le voci della cronologia?" + "value" : "Nell'intervallo" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "入力履歴をすべて削除しますか?" + "value" : "範囲内" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på at du vil slette alle historieoppføringer?" + "value" : "I målområdet" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Weet je zeker dat je de gehele pompgeschiedenis wilt verwijderen?" + "value" : "Binnen bereik" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Czy jesteś pewien, że chcesz usunąć z Loop wszystkie dane historyczne pompy?" + "value" : "W zakresie" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Tem certeza de que deseja excluir todas as entradas do histórico?" + "value" : "No alvo" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Sigur doriți să ștergeți toate înregistrările din istoric?" + "value" : "În interval" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Подтвердите удаление всех записей истории?" + "value" : "В диапазоне" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "V rozsahu" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Säkert att du vill radera all händelsehistorik?" + "value" : "Inom målområdet" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tüm geçmiş girişlerini silmek istediğinizden emin misiniz?" + "value" : "Aralıkta" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "У діапазоні" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bạn có chắc muốn xóa hết các dữ liệu cũ?" + "value" : "Trong khoảng" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "确定要删除所有历史记录吗?" + "value" : "范围内" } } } }, - "Are you sure you want to delete all logged dose entries?" : { - "comment" : "Action sheet confirmation message for logged dose deletion", + "Infusion set changed" : { + "comment" : "Pump event in the history: the infusion set was replaced", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تم تغيير مجموعة التسريب" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infuzní set vyměněn" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på, at du vil slette alle logget dosis?" + "value" : "Infusionssæt skiftet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Möchtest Du wirklich alle protokollierten Dosis Einträge löschen?" + "value" : "Infusionsset gewechselt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "¿Estás seguro de que quieres borrar todas las entradas de dosis registradas?" + "value" : "Equipo de infusión cambiado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Haluatko varmasti poistaa kaikki kirjatut annostelutiedot?" + "value" : "Infuusiosetti vaihdettu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Voulez-vous vraiment supprimer toutes les entrées de dose enregistrées?" + "value" : "Cathéter changé" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בטוח שברצונך למחוק את כל ערכי המנות?" + "value" : "סט העירוי הוחלף" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infúziós szerelék cserélve" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Sei sicuro di voler eliminare tutte le dosi inserite?" + "value" : "Set di infusione cambiato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "インフュージョンセット交換" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på at du vil slette alle loggførte doseoppføringer?" + "value" : "Infusjonssett byttet" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Weet je zeker dat je de gehele doseringsgeschiedenis wilt verwijderen?" + "value" : "Infuusset vervangen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Czy na pewno chcesz usunąć wszystkie zapisane wpisy dawek?" + "value" : "Wymieniono zestaw infuzyjny" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conjunto de infusão trocado" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Sigur doriți să ștergeți toate înregistrările despre dozele de insulina?" + "value" : "Set de infuzie schimbat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Вы уверены, что хотите удалить все зарегистрированные записи о дозах?" + "value" : "Инфузионный набор заменён" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Infúzny set vymenený" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Är du säker på att du vill ta bort alla dina loggade doser?" + "value" : "Infusionsset bytt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Günlüğe kaydedilen tüm doz girişlerini silmek istediğinizden emin misiniz?" + "value" : "İnfüzyon seti değiştirildi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Інфузійний набір замінено" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã thay bộ truyền" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "是否确定删除全部注射记录?" + "value" : "已更换输注管路" } } } }, - "Are you sure you want to delete all reservoir values?" : { - "comment" : "Action sheet confirmation message for reservoir deletion", + "Insulin isn't being adjusted. Tap for details." : { + "comment" : "Notice detail on the Now screen when Loop hasn't completed recently", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا يتم تعديل الأنسولين. اضغط للتفاصيل." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulín se neupravuje. Klepněte pro podrobnosti." + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på at du vil slette alle reservoirværdier?" + "value" : "Insulin bliver ikke justeret. Tryk for detaljer." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Möchtest Du wirklich alle Reservoirwerte löschen?" + "value" : "Insulin wird nicht angepasst. Für Details tippen." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "¿Estás seguro de querer eliminar todos los datos del reservorio?" + "value" : "La insulina no se está ajustando. Toca para ver detalles." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Haluatko varmasti poistaa kaikki säiliön arvot?" + "value" : "Insuliinia ei säädetä. Napauta nähdäksesi lisätiedot." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Voulez-vous vraiment supprimer toutes les valeurs de réservoir?" + "value" : "L'insuline n'est pas ajustée. Touchez pour en savoir plus." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בטוח שברצונך למחוק את כל ערכי המאגר?" + "value" : "האינסולין אינו מותאם. הקש לפרטים." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Az inzulin nem kerül módosításra. Koppints a részletekért." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Sei sicuro di voler eliminare tutti i valori del serbatoio?" + "value" : "L'insulina non viene regolata. Tocca per i dettagli." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "リザーバの値をすべて削除しますか?" + "value" : "インスリンが調整されていません。タップして詳細を表示。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på at du vil slette alle reservoarverdier?" + "value" : "Insulin blir ikke justert. Trykk for detaljer." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Weet je zeker dat je alle waarden van het reservoir wilt verwijderen?" + "value" : "Insuline wordt niet aangepast. Tik voor details." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Czy jesteś pewien, że chcesz usunąć wszystkie wartości zbiornika?" + "value" : "Insulina nie jest dostosowywana. Stuknij, aby zobaczyć szczegóły." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Tem certeza de que deseja excluir todos os valores do reservatório?" + "value" : "A insulina não está sendo ajustada. Toque para ver detalhes." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Sigur doriți să ștergeți toate valorile de rezervor?" + "value" : "Insulina nu este ajustată. Atingeți pentru detalii." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Подтвердите удаление всех записей резервуара?" + "value" : "Инсулин не регулируется. Нажмите для подробностей." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulín sa neupravuje. Klepnite pre podrobnosti." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Säkert att du vill radera alla reservoarvärden?" + "value" : "Insulinet justeras inte. Tryck för detaljer." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tüm rezervuar değerlerini silmek istediğinizden emin misiniz?" + "value" : "İnsülin ayarlanmıyor. Ayrıntılar için dokunun." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Інсулін не регулюється. Торкніться, щоб дізнатися більше." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bạn có chắc muốn xóa hết mọi giá trị của ngăn chứa insulin?" + "value" : "Insulin không được điều chỉnh. Chạm để xem chi tiết." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "是否确定删除全部储液量记录?" + "value" : "胰岛素未在调整。轻点查看详情。" } } } }, - "Are you sure you want to delete all your %@ Data?\n(This action is not reversible)" : { - "comment" : "Confirmation before you delete all your Simulated Test Devices data", + "Insulin per day" : { + "comment" : "Trends tile and card title: average total insulin per day", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الأنسولين يوميًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulín za den" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på, at du vil slette alle dine %@ data?\n(Denne handling kan ikke fortrydes)" + "value" : "Insulin pr. dag" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Möchtest Du wirklich alle %@-Daten löschen?\n(Diese Aktion kann nicht rückgängig gemacht werden)" + "value" : "Insulin pro Tag" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "¿Estás seguro de que quieres eliminar todos tus datos de %@ ?\n (Esta acción no es reversible)" + "value" : "Insulina por día" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Haluatko varmasti poistaa kaikki %@ tietosi?\n(Tämä toiminto ei ole palautettavissa)" + "value" : "Insuliini päivässä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Voulez-vous vraiment effacer toutes vos valeurs de %@?\n(Cette action n'est pas réversible)" + "value" : "Insuline par jour" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בטוח שברצונך למחוק את כל מידע %@?\n(פעולה זו בלתי הפיכה)" + "value" : "אינסולין ליום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulin naponta" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Sei sicuro di voler eliminare tutti i tuoi dati %@ ?\n (Questa azione non è reversibile)" + "value" : "Insulina al giorno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "1日のインスリン量" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på at du vil slette alle dine %@ Data?\n(Denne handlingen kan ikke angres)" + "value" : "Insulin per dag" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Weet je zeker dat je al je %@-gegevens wilt verwijderen?\n(Deze actie is niet omkeerbaar)" + "value" : "Insuline per dag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Czy na pewno chcesz usunąć wszystkie swoje dane %@ ?\n (Ta czynność jest nieodwracalna)" + "value" : "Insulina dziennie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulina por dia" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Sunteți sigur că vreți să ștergeți toate datele %@.\n(Această acțiune nu este reversibilă)" + "value" : "Insulină pe zi" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Вы уверены, что хотите удалить все свои данные %@ ?\n (Это действие необратимо)" + "value" : "Инсулин в день" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulín za deň" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Vill du ta bort alla dina %@data?\n(Denna åtgärd är inte reversibel)" + "value" : "Insulin per dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tüm %@ Verilerinizi silmek istediğinizden emin misiniz?\n (Bu eylem geri alınamaz)" + "value" : "Günlük insülin" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Інсулін на день" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulin mỗi ngày" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "确定要删除所有 %@ 数据吗?(此操作无法恢复)" + "value" : "每日胰岛素" } } } }, - "Are you sure you want to delete all your testing Data?\n(This action is not reversible)" : { - "comment" : "The message displayed in an alert that lets the user delete all their testing data.", - "isCommentAutoGenerated" : true - }, - "Are you sure you want to delete this CGM?" : { - "comment" : "Confirmation message for deleting a CGM", + "Insulin per day, average %1$@" : { + "comment" : "VoiceOver label for the Trends Insulin per day chart. (1: average insulin per day, e.g. 32.1 U)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "هل أنت متأكد أنك تريد حذف هذا CGM؟" + "value" : "الأنسولين يوميًا، المتوسط %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulín za den, průměr %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på, at du vil slette denne CGM?" + "value" : "Insulin pr. dag, gennemsnit %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bist Du sicher, dass Du dieses CGM löschen möchtest?" + "value" : "Insulin pro Tag, Durchschnitt %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "¿Está seguro de que quiere eliminar este MCG?" + "value" : "Insulina por día, promedio %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Haluatko varmasti poistaa CGM:n?" + "value" : "Insuliini päivässä, keskiarvo %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Voulez-vous vraiment supprimer ce CGM?" + "value" : "Insuline par jour, moyenne %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בטוח שברצונך למחוק את חיישן זה?" + "value" : "אינסולין ליום, ממוצע %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulin naponta, átlag %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Sei sicuro di voler eliminare questo CGM?" + "value" : "Insulina al giorno, media %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "このCGMを削除しますか?" + "value" : "1日のインスリン量、平均 %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på at du vil slette denne CGM?" + "value" : "Insulin per dag, gjennomsnitt %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Weet je zeker dat je deze CGM wilt verwijderen" + "value" : "Insuline per dag, gemiddeld %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Czy na pewno chcesz usunąć ten CGM?" + "value" : "Insulina dziennie, średnio %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Você está certo que quer remover este CGM?" + "value" : "Insulina por dia, média %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Sunteți sigur că vreți să ștergeți acest senzor de glicemie?" + "value" : "Insulină pe zi, medie %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Вы уверены, что хотите удалить этот CGM?" + "value" : "Инсулин в день, в среднем %1$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Naozaj chcete odstrániť toto CGM?" + "value" : "Inzulín za deň, priemer %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Är du säker på att du vill radera denna CGM?" + "value" : "Insulin per dag, medel %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bu CGM'i silmek istediğinizden emin misiniz?" + "value" : "Günlük insülin, ortalama %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Інсулін на день, у середньому %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bạn có chắc sẽ xóa CGM này?" + "value" : "Insulin mỗi ngày, trung bình %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "确定要删除该CGM数据源?" + "value" : "每日胰岛素,平均 %1$@" } } } }, - "Are you sure you want to delete this food?" : { + "Insulin per day, weekly average, average %1$@" : { + "comment" : "VoiceOver label for the Trends Insulin per day chart when bars are weekly averages. (1: average insulin per day, e.g. 32.1 U)", "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Er du sikker på, at du vil slette denne mad?" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bist Du sicher, dass Du diesen Favoriten löschen möchtest?" - } - }, - "fr" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Êtes-vous sûr de vouloir supprimer cet aliment ?" + "value" : "الأنسولين يوميًا، متوسط أسبوعي، المتوسط %1$@" } }, - "it" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Sei sicuro di voler eliminare questo cibo?" + "value" : "Inzulín za den, týdenní průměr, průměr %1$@" } }, - "nb" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på at du vil slette denne maten?" + "value" : "Insulin pr. dag, ugegennemsnit, gennemsnit %1$@" } }, - "nl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Weet je zeker dat je dit voedingsmiddel wilt verwijderen?" + "value" : "Insulin pro Tag, Wochendurchschnitt, Durchschnitt %1$@" } }, - "pl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Czy na pewno chcesz usunąć to jedzenie?" + "value" : "Insulina por día, promedio semanal, promedio %1$@" } }, - "ro" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Sunteți sigur că vreți să ștergeți acest aliment?" + "value" : "Insuliini päivässä, viikkokeskiarvo, keskiarvo %1$@" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "你确定要删除该食物吗?" - } - } - } - }, - "Are you sure you want to delete this service?" : { - "comment" : "Confirmation message for deleting a service", - "extractionState" : "manual", - "localizations" : { - "cs" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Opravdu chcete tuto službu smazat?" + "value" : "Insuline par jour, moyenne hebdomadaire, moyenne %1$@" } }, - "da" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på, du vil slette denne service?" + "value" : "אינסולין ליום, ממוצע שבועי, ממוצע %1$@" } }, - "de" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Bist Du sicher, dass Du diesen Dienst löschen möchtest?" + "value" : "Inzulin naponta, heti átlag, átlag %1$@" } }, - "es" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "¿Está seguro de que desea eliminar este servicio?" + "value" : "Insulina al giorno, media settimanale, media %1$@" } }, - "fi" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Haluatko varmasti poistaa tämän palvelun?" + "value" : "1日のインスリン量、週平均、平均 %1$@" } }, - "fr" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Voulez-vous vraiment supprimer ce service?" + "value" : "Insulin per dag, ukesgjennomsnitt, gjennomsnitt %1$@" } }, - "he" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "בטוח שברצונך למחוק את שירות זה?" + "value" : "Insuline per dag, weekgemiddelde, gemiddeld %1$@" } }, - "it" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Sei sicuro di voler eliminare questo servizio?" + "value" : "Insulina dziennie, średnia tygodniowa, średnio %1$@" } }, - "nb" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Er du sikker på at du vil slette denne tjenesten?" + "value" : "Insulina por dia, média semanal, média %1$@" } }, - "nl" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Weet je zeker dat je deze service wil verwijderen?" + "value" : "Insulină pe zi, medie săptămânală, medie %1$@" } }, - "pl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Czy na pewno chcesz usunąć tę usługę?" + "value" : "Инсулин в день, среднее за неделю, в среднем %1$@" } }, - "ro" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Sunteți sigur că vreți să ștergeți acest serviciu?" + "value" : "Inzulín za deň, týždenný priemer, priemer %1$@" } }, - "ru" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Вы уверены, что хотите удалить этот сервис?" + "value" : "Insulin per dag, veckomedel, medel %1$@" } }, - "sk" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Naozaj chcete odstrániť túto službu?" + "value" : "Günlük insülin, haftalık ortalama, ortalama %1$@" } }, - "sv" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Vill du ta bort den här tjänsten?" + "value" : "Інсулін на день, середнє за тиждень, у середньому %1$@" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bu servisi silmek istediğinizden emin misiniz?" + "value" : "Insulin mỗi ngày, trung bình theo tuần, trung bình %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "您确定要删除此服务吗?" + "value" : "每日胰岛素,按周平均,平均 %1$@" } } } }, - "Are you sure you want to turn automation OFF?" : { - "comment" : "Closed loop alert title" - }, - "Arm test alert" : { - "comment" : "A button that arms a test alert for a glucose level below the normal range.", - "isCommentAutoGenerated" : true - }, - "Arming substitutes a below-threshold value in place of the next real CGM reading, so the alert fires from whatever app state Loop is in at that moment." : { - "comment" : "A footer text in the \"Arm test alert\" button's section, explaining how it works.", - "isCommentAutoGenerated" : true - }, - "ask yourself, am I more likely to go high or low during this event?" : { - - }, - "at %@" : { - "comment" : "Format fragment for a specific time", + "Insulin timeline, %1$@, bolus %2$@, basal %3$@, carbs %4$@" : { + "comment" : "VoiceOver summary of the day's insulin timeline chart with no glucose readings. (1: weekday and date; 2: bolus total, e.g. 12.5 U; 3: basal total; 4: carbs total, e.g. 140 g)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "في %@" + "value" : "مخطط الأنسولين، %1$@، Bolus %2$@، القاعدية %3$@، الكارب %4$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Časová osa inzulínu, %1$@, bolus %2$@, bazál %3$@, sacharidy %4$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "at %@" + "value" : "Insulintidslinje, %1$@, bolus %2$@, basal %3$@, kulhydrater %4$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "um %@" + "value" : "Insulin-Zeitleiste, %1$@, Bolus %2$@, Basal %3$@, KH %4$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "en %@" + "value" : "Cronología de insulina, %1$@, bolo %2$@, basal %3$@, carbohidratos %4$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "klo %@" + "value" : "Insuliinin aikajana, %1$@, bolus %2$@, basaali %3$@, hiilihydraatit %4$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "à %@" + "value" : "Chronologie de l'insuline, %1$@, bolus %2$@, basal %3$@, glucides %4$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "ב-%@" + "value" : "ציר זמן אינסולין, %1$@, Bolus %2$@, Basal %3$@, פחמימות %4$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulin idővonal, %1$@, bólus %2$@, basal %3$@, szénhidrát %4$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "a %@" + "value" : "Cronologia insulina, %1$@, bolo %2$@, basale %3$@, carboidrati %4$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%@ 時点" + "value" : "インスリンのタイムライン、%1$@、ボーラス %2$@、ベーサル %3$@、カーボ %4$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "kl %@" + "value" : "Insulintidslinje, %1$@, bolus %2$@, basal %3$@, karbohydrater %4$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "om %@" + "value" : "Insulinetijdlijn, %1$@, bolus %2$@, basaal %3$@, koolhydraten %4$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "o %@" + "value" : "Oś czasu insuliny, %1$@, bolus %2$@, baza %3$@, węglowodany %4$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "em %@" + "value" : "Linha do tempo de insulina, %1$@, bolus %2$@, basal %3$@, carbs %4$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "la %@" + "value" : "Cronologie insulină, %1$@, bolus %2$@, bazală %3$@, carbohidrați %4$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "В %@" + "value" : "Хронология инсулина, %1$@, болюс %2$@, базал %3$@, углеводы %4$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "o %@" + "value" : "Časová os inzulínu, %1$@, bolus %2$@, bazál %3$@, sacharidy %4$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "kl. %@" + "value" : "Insulintidslinje, %1$@, bolus %2$@, basal %3$@, kolhydrater %4$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%@" + "value" : "İnsülin zaman çizelgesi, %1$@, bolus %2$@, bazal %3$@, karb %4$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Хронологія інсуліну, %1$@, болюс %2$@, базал %3$@, вуглеводи %4$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "lúc %@" + "value" : "Dòng thời gian insulin, %1$@, Bolus %2$@, Basal %3$@, Carbs %4$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%@分钟内" + "value" : "胰岛素时间线,%1$@,大剂量 %2$@,基础 %3$@,碳水 %4$@" } } } }, - "at %1$@" : { - "comment" : "when adding a timestamp. (1: the formatted timestamp)\nwhen adding the date and time. (1: the formatted date and time)" - }, - "At 100%%, %@ assumes your insulin needs are the same as usual." : { - - }, - "Authenticate to Bolus %@ Units" : { - "comment" : "The message displayed during a device authentication prompt for bolus specification", + "Insulin timeline, %1$@, bolus %2$@, basal %3$@, carbs %4$@, latest glucose %5$@ %6$@" : { + "comment" : "VoiceOver summary of the day's insulin timeline chart. (1: weekday and date; 2: bolus total, e.g. 12.5 U; 3: basal total; 4: carbs total, e.g. 140 g; 5: latest glucose value; 6: glucose unit, mmol/L or mg/dL)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "المصادة على ضخ %@ وحدات" + "value" : "مخطط الأنسولين، %1$@، Bolus %2$@، القاعدية %3$@، الكارب %4$@، آخر قراءة سكر %5$@ %6$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Časová osa inzulínu, %1$@, bolus %2$@, bazál %3$@, sacharidy %4$@, poslední glukóza %5$@ %6$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Godkend bolus af %@ Enheder" + "value" : "Insulintidslinje, %1$@, bolus %2$@, basal %3$@, kulhydrater %4$@, seneste glukose %5$@ %6$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bolusabgabe von %@ IE bestätigen" + "value" : "Insulin-Zeitleiste, %1$@, Bolus %2$@, Basal %3$@, KH %4$@, letzter Blutzucker %5$@ %6$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Autenticar para Bolo %@ Unidades" + "value" : "Cronología de insulina, %1$@, bolo %2$@, basal %3$@, carbohidratos %4$@, última glucosa %5$@ %6$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Vahvista bolus %@ yksikköä" + "value" : "Insuliinin aikajana, %1$@, bolus %2$@, basaali %3$@, hiilihydraatit %4$@, viimeisin glukoosi %5$@ %6$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Authentifiez-vous pour faire un bolus de %@ Unités" + "value" : "Chronologie de l'insuline, %1$@, bolus %2$@, basal %3$@, glucides %4$@, dernière glycémie %5$@ %6$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticate to Bolus %@ Units" + "value" : "ציר זמן אינסולין, %1$@, Bolus %2$@, Basal %3$@, פחמימות %4$@, סוכר אחרון %5$@ %6$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulin idővonal, %1$@, bólus %2$@, basal %3$@, szénhidrát %4$@, legutóbbi glükóz %5$@ %6$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Esegui l'autenticazione per il bolo di %@ Unità" + "value" : "Cronologia insulina, %1$@, bolo %2$@, basale %3$@, carboidrati %4$@, ultima glicemia %5$@ %6$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ボーラス %@単位 認証してください" + "value" : "インスリンのタイムライン、%1$@、ボーラス %2$@、ベーサル %3$@、カーボ %4$@、最新の血糖値 %5$@ %6$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Autentiserer for å gi %@ Enheter i Bolus" + "value" : "Insulintidslinje, %1$@, bolus %2$@, basal %3$@, karbohydrater %4$@, siste blodsukker %5$@ %6$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticeer om %@ E te bolussen" + "value" : "Insulinetijdlijn, %1$@, bolus %2$@, basaal %3$@, koolhydraten %4$@, laatste glucose %5$@ %6$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Autoryzacja Bolusa %@ jednostek" + "value" : "Oś czasu insuliny, %1$@, bolus %2$@, baza %3$@, węglowodany %4$@, ostatnia glukoza %5$@ %6$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Autentique para Bolus de %@ Unidades" + "value" : "Linha do tempo de insulina, %1$@, bolus %2$@, basal %3$@, carbs %4$@, última glicose %5$@ %6$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Autentificare pentru bolusare %@ unități" + "value" : "Cronologie insulină, %1$@, bolus %2$@, bazală %3$@, carbohidrați %4$@, ultima glicemie %5$@ %6$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Подтверждение болюса %@ ед" + "value" : "Хронология инсулина, %1$@, болюс %2$@, базал %3$@, углеводы %4$@, последняя глюкоза %5$@ %6$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Potvrdiť pre Bolus %@ Jednotky" + "value" : "Časová os inzulínu, %1$@, bolus %2$@, bazál %3$@, sacharidy %4$@, posledná glykémia %5$@ %6$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Godkänn bolus på %@ enheter" + "value" : "Insulintidslinje, %1$@, bolus %2$@, basal %3$@, kolhydrater %4$@, senaste glukos %5$@ %6$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus için kimlik doğrula %@ Ünite" + "value" : "İnsülin zaman çizelgesi, %1$@, bolus %2$@, bazal %3$@, karb %4$@, son KŞ %5$@ %6$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Хронологія інсуліну, %1$@, болюс %2$@, базал %3$@, вуглеводи %4$@, остання глюкоза %5$@ %6$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Xác thực liều Bolus %@ Units" + "value" : "Dòng thời gian insulin, %1$@, Bolus %2$@, Basal %3$@, Carbs %4$@, đường huyết mới nhất %5$@ %6$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "解锁以输注大剂量 %@ 单位" + "value" : "胰岛素时间线,%1$@,大剂量 %2$@,基础 %3$@,碳水 %4$@,最新血糖 %5$@ %6$@" } } } }, - "Authenticate to log %@ Units" : { - "comment" : "The message displayed during a device authentication prompt to log an insulin dose", + "Invalid future glucose" : { + "comment" : "Reason Loop could not run: a glucose reading had a timestamp in the future", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قراءة سكر مستقبلية غير صالحة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glukóza s budoucím časem" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Godkend for at logge %@ enheder" + "value" : "Ugyldig glukosemåling i fremtiden" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Authentifiziere Dich, um %@ Einheiten zu protokollieren." + "value" : "Ungültiger Blutzuckerwert in der Zukunft" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Autenticarse para registrar %@ Unidades" + "value" : "Glucosa futura no válida" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Vahvista kirjaus %@ yksikköä" + "value" : "Virheellinen tulevaisuuden glukoosiarvo" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Authentifier pour enregistrer %@ unités" + "value" : "Glycémie future non valide" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קריאת סוכר עתידית לא תקינה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Érvénytelen, jövőbeli glükózérték" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Esegui l'autenticazione per registrare %@ Unità" + "value" : "Glicemia futura non valida" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "未来時刻の無効な血糖値" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Autentiser for å logge %@ Enheter" + "value" : "Ugyldig blodsukkermåling i fremtiden" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticeer om %@ eenheden te registreren" + "value" : "Ongeldige glucosewaarde in de toekomst" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Autoryzuj, aby podać %@ Jednostki" + "value" : "Glukoza z przyszłą datą" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicose futura inválida" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Autentificare pentru a înregistra %@ unități" + "value" : "Glicemie invalidă, din viitor" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Пройдите аутентификацию для подтверждения болюса %@ Единиц" + "value" : "Глюкоза с временем в будущем" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glykémia s budúcim časom" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Godkänn att logga %@ enheter" + "value" : "Ogiltigt glukosvärde i framtiden" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%@ Ünite günlüğe kaydetmek için kimlik doğrulaması yapın" + "value" : "Geçersiz, ileri tarihli KŞ" } }, - "zh-Hans" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "请验证身份以记录 %@U 胰岛素" + "value" : "Глюкоза з часом у майбутньому" } - } - } - }, - "Automated" : { - - }, - "Automated (↑ Increase)" : { - - }, - "Automated (↓ Decrease)" : { - - }, - "Automated (Preset Basal Rate)" : { - - }, - "Automated (Scheduled)" : { - - }, - "Automated insulin adjustments by %@ reduce a noticeable rise in glucose" : { - - }, - "Automation" : { - - }, - "Automation is off" : { - "comment" : "title for when automation is off" - }, - "Automation is on" : { - "comment" : "title for when automation is on" - }, - "Automation is unavailable" : { - "comment" : "title for when automation is unavailable" - }, - "Automation is unavailable while a manual temporary basal is in progress.\n\nCancel the manual temporary basal if you wish for the app to automate insulin delivery." : { - "comment" : "message when automation is on and a manual temp basal is in progress" - }, - "Automation is unavailable while your CGM sensor is warming up.\n\nIn the meantime, your pump is still able to deliver insulin.\n\nAutomation will resume when CGM readings are received." : { - "comment" : "message when automation is on and CGM is in warmup" - }, - "Automation is unavailable while your insulin is suspended.\n\nResume insulin if you wish for the app to automate insulin delivery." : { - "comment" : "message when automation is on and insulin delivery is suspended" - }, - "Automation OFF" : { - - }, - "Automation ON" : { - - }, - "Automation unavailable" : { - - }, - "Automation was unsuccessful" : { - "comment" : "title for when automation was unsuccessful" - }, - "Average" : { - "comment" : "Average glucose metric title" - }, - "Average Glucose" : { - - }, - "Basal Rate" : { - + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đường huyết có thời gian trong tương lai không hợp lệ" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "无效的未来血糖" + } + } + } }, - "Basal Rate Schedule" : { - "comment" : "Details for configuration error when basal rate schedule is missing", + "IOB" : { + "comment" : "Abbreviation for insulin on board (active insulin) Abbreviation for insulin on board; label of a tile on the Now screen", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "جدول الضخ المستمر" + "value" : "IOB" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "IOB" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Basalrateskema" + "value" : "IOB" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Basalraten-Plan" + "value" : "IOB" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Perfil Basal" + "value" : "IOB" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Basaaliohjelma" + "value" : "IOB" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Programme débit basal" + "value" : "IA" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Basal Rate Schedule" + "value" : "IOB" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "IOB" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tabella di velocità basale" + "value" : "IOB" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "基礎レートスケジュール" + "value" : "IOB" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Tidsplan for basaldoser" + "value" : "IOB" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Basaalstandenschema" + "value" : "IOB" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Harmonogram dawki standardowej" + "value" : "IOB" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Programação da Taxa Basal" + "value" : "IOB" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Orar rate bazale" + "value" : "IOB" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Скорости базала" + "value" : "IOB" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Harmonogram bazálnej dávky" + "value" : "IOB" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Basaldosschema" + "value" : "IOB" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bazal Oran Çizelgesi" + "value" : "IOB" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "IOB" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lịch biểu tiêm liều basal" + "value" : "IOB" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "基础率表" + "value" : "IOB" } } } }, - "Basal Rates" : { - "comment" : "The title of the basal rate profile screen\n The title text for the basal rate schedule", - "extractionState" : "manual", + "IOB (U, left)" : { + "comment" : "Chart legend: insulin on board in units, on the left axis", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "الضخ المستمر" + "value" : "IOB (وحدة، يسار)" } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Úrovně bazálu" + "value" : "IOB (U, vlevo)" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Basalrater" + "value" : "IOB (E, venstre)" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Basalrate" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Basal Rates" + "value" : "IOB (IE, links)" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Tasas basales" + "value" : "IOB (U, izquierda)" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Basaalitasot" + "value" : "IOB (U, vasen)" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Débits basaux" + "value" : "IA (U, gauche)" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Basal Rates" + "value" : "IOB (U, שמאל)" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "IOB (U, bal)" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Velocità basali" + "value" : "IOB (U, sinistra)" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "基礎レート" + "value" : "IOB(U、左)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Basal-satser" + "value" : "IOB (E, venstre)" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Basaalstanden" + "value" : "IOB (E, links)" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dawka Podstawowa (Baza)" + "value" : "IOB (J, lewa oś)" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Taxas Basais" + "value" : "IOB (U, esquerda)" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Rate bazale" + "value" : "IOB (U, stânga)" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Скорости базала" + "value" : "IOB (Ед, слева)" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Bazálne dávky" + "value" : "IOB (j, vľavo)" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Basaldoser" + "value" : "IOB (E, vänster)" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bazal Oranlar" + "value" : "IOB (Ü, sol)" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "IOB (U, ліворуч)" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lịch biểu tiêm liều nền" + "value" : "IOB (U, bên trái)" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "基础率" + "value" : "IOB(U,左轴)" } } } }, - "Basal: " : { - - }, - "Based on your predicted glucose, no bolus is recommended." : { - "comment" : "Caption for bolus screen notice when no bolus is recommended for the predicted glucose", + "Last reading %1$@ ago" : { + "comment" : "Shown on the Now screen under No reading when the latest CGM reading is too old. (1: duration, e.g. 25m)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "آخر قراءة قبل %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Poslední hodnota před %1$@" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Baseret på din forventede glukose anbefales ingen bolus." + "value" : "Seneste måling for %1$@ siden" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Basierend auf Deinem vorhergesagten Blutzucker wird kein Bolus empfohlen." + "value" : "Letzter Wert vor %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Basándose en su glucosa proyectada, no se recomienda ningún bolo." + "value" : "Última lectura hace %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Viimeisin lukema %1$@ sitten" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Sur la base de votre glycémie prévue, aucun bolus n’est recommandé." + "value" : "Dernière mesure il y a %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בהתבסס על הגלוקוז החזוי שלך, לא מומלץ שום בולוס." + "value" : "קריאה אחרונה לפני %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utolsó érték %1$@ ezelőtt" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "In base alla glicemia prevista, non è consigliato alcun bolo." + "value" : "Ultima lettura %1$@ fa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "最終測定 %1$@前" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Basert på ditt forventede blodsukker, anbefales ingen bolus." + "value" : "Siste måling for %1$@ siden" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Op basis van je voorspelde glucose, wordt een bolus niet aanbevolen." + "value" : "Laatste waarde %1$@ geleden" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Na podstawie przewidywanej glikemii nie zaleca się podawania bolusa." + "value" : "Ostatni odczyt %1$@ temu" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Última leitura há %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Pe baza glicemiei prognozate, nu se recomandă niciun bolus." + "value" : "Ultima citire acum %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Основываясь на вашей прогнозируемой глюкозе, болюс не рекомендуется." + "value" : "Последнее показание %1$@ назад" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Posledná hodnota pred %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Senaste värde för %1$@ sedan" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tahmini KŞ'ne bağlı olarak bolus önerilmez." + "value" : "Son okuma %1$@ önce" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Останній показник %1$@ тому" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chỉ số cuối cách đây %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "根据您的预测血糖值,当前不建议注射大剂量。" + "value" : "最后读数在 %1$@前" } } } }, - "Because Omar has gone low while working outdoors in the past, he raises his preset correction range to help prevent another low." : { - - }, - "Before" : { - - }, - "Below range (<70): %d%% · goal <4%%" : { - "comment" : "TIR below-range summary" - }, - "Bluetooth\nOff" : { - "comment" : "Message to the user to that the bluetooth is off", + "Limited" : { + "comment" : "Trends Loop status: time closed loop was on but Loop wasn't completing runs", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "محدود" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Omezeno" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth slået fra" + "value" : "Begrænset" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth aus" + "value" : "Eingeschränkt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\nApagado" + "value" : "Limitado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth ei ole käytössä" + "value" : "Rajoitettu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth désactivé" + "value" : "Limitée" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בלוטות׳ כבוי" + "value" : "מוגבל" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Korlátozott" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\nDisattivato" + "value" : "Limitato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "制限あり" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Blåtann\nAv" + "value" : "Begrenset" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\nUit" + "value" : "Beperkt" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth jest wyłączony" + "value" : "Ograniczona" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Limitado" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth \nOprit" + "value" : "Limitat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\n Выключен" + "value" : "Ограничен" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obmedzená" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth Av" + "value" : "Begränsad" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\nKapalı" + "value" : "Sınırlı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Обмежено" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hạn chế" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "蓝牙已关闭" + "value" : "受限" } } } }, - "Bluetooth\nUnavailable" : { - "comment" : "Message to the user that bluetooth is unavailable to the app", + "Logbook" : { + "comment" : "Title of the Logbook tab Title of the Logbook tab in the redesigned interface, listing past events", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "السجل" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deník" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth ikke tilgængelig" + "value" : "Logbog" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth nicht verfügbar" + "value" : "Logbuch" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth \nNo Disponible" + "value" : "Registro" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth ei ole käytettävissä" + "value" : "Lokikirja" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\nIndisponible" + "value" : "Journal" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בלוטות׳ לא זמין" + "value" : "יומן" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Napló" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\nNon disponibile" + "value" : "Diario" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ログブック" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Blåtann\nUtilgjengelig" + "value" : "Loggbok" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\nniet beschikbaar" + "value" : "Logboek" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth niedostępny" + "value" : "Dziennik" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Diário" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth \nIndisponibil" + "value" : "Jurnal" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\n Недоступен" + "value" : "Журнал" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denník" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth är inte tillgängligt" + "value" : "Loggbok" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\nKullanılamıyor" + "value" : "Kayıt Defteri" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Журнал" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nhật ký" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "蓝牙不可用" + "value" : "日志" } } } }, - "Bluetooth Off Alert" : { - "comment" : "Bluetooth off alert title", + "logged" : { + "comment" : "Logbook bolus row detail: the dose was logged by hand rather than delivered by the pump", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "مُسجَّل يدويًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "zadáno ručně" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Advarsel om Bluetooth slået fra" + "value" : "registreret manuelt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth-Aus Warnung" + "value" : "eingetragen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Alerta de Bluetooth apagado" + "value" : "registrado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth ei ole käytössä -hälytys" + "value" : "kirjattu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth désactivé" + "value" : "saisi" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "התראת בלוטות׳ כבוי" + "value" : "נרשם ידנית" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "naplózva" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Avviso Bluetooth disattivato" + "value" : "registrato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "手動記録" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth Avslått-varsel" + "value" : "registrert manuelt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth uit melding" + "value" : "handmatig vastgelegd" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Alert! Bluetooth jest wyłączony!" + "value" : "wpisany ręcznie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "registrado" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Alertă Bluetooth dezactivat" + "value" : "înregistrat manual" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Оповещение об отключении Bluetooth" + "value" : "внесено вручную" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "zadané ručne" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Varning Bluetooth är Av" + "value" : "loggad" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth Kapalı Uyarısı" + "value" : "elle kaydedildi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "внесено вручну" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ghi tay" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "蓝牙关闭提醒" + "value" : "手动记录" } } } }, - "Bluetooth Unavailable Alert" : { - "comment" : "Bluetooth unavailable alert title", + "Loop" : { + "comment" : "Logbook filter chip: show only what Loop did automatically (Loop is the app's name) Logbook row detail: Loop made this change automatically (Loop is the app's name)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth er ikke tilgængelig" + "value" : "Loop" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth nicht Verfügbar-Warnung" + "value" : "Loop" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Alerta de Bluetooth no disponible" + "value" : "Loop" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth ei ole käytettävissä -hälytys" + "value" : "Loop" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth indisponible" + "value" : "Loop" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "התראת בלוטות׳ לא זמין" + "value" : "Loop" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Avviso Bluetooth non disponibile" + "value" : "Loop" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Varsel om at Bluetooth er utilgjengelig" + "value" : "Loop" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth niet beschikbaar melding" + "value" : "Loop" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Alarm! Bluetooth niedostępny" + "value" : "Loop" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Alertă Bluetooth indisponibil" + "value" : "Loop" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Оповещение о недоступности Bluetooth" + "value" : "Loop" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Varning Bluetooth är inte tillgänglig" + "value" : "Loop" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth Kullanılamıyor Uyarısı" + "value" : "Loop" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "蓝牙不可用提示" + "value" : "Loop" } } } }, - "Bolus" : { - "comment" : "Label for bolus entry row on bolus screen\nLabel for bolus entry row on simple bolus screen\nTitle for bolus entry screen", + "Loop active" : { + "comment" : "Trends summary tile: share of the period Loop spent in closed loop", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop نشط" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop aktivní" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop aktiv" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop aktiv" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo" + "value" : "Loop activo" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop aktiivinen" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop actif" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop פעיל" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop aktív" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo" + "value" : "Loop attivo" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ボーラス" + "value" : "Loop稼働" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop aktiv" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop actief" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop aktywny" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop ativo" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop activ" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Болюс" + "value" : "Loop активен" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop aktívny" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop aktiv" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop aktif" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop активний" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus" + "value" : "Loop hoạt động" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "大剂量" + "value" : "Loop 运行" } } } }, - "Bolus Canceled: Delivered %1$@ of %2$@" : { - "comment" : "The title of the cell indicating a bolus has been canceled. (1: delivered volume)(2: total volume)" - }, - "Bolus Issue" : { - "comment" : "The notification title for a bolus issue", + "Loop can't adjust insulin without readings." : { + "comment" : "Notice detail on the Now screen under a CGM problem when there is no recent glucose reading", "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bolusproblem" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bolus Problem" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Problema con el bolo" - } - }, - "fr" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Problème avec le bolus" + "value" : "لا يستطيع Loop تعديل الأنسولين بدون قراءات." } }, - "it" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Problema con il bolo" + "value" : "Loop nemůže upravovat inzulín bez hodnot." } }, - "nb" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus feil" + "value" : "Loop kan ikke justere insulin uden målinger." } }, - "nl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bolusprobleem" + "value" : "Loop kann das Insulin ohne Messwerte nicht anpassen." } }, - "pl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Problem z bolusem" + "value" : "Loop no puede ajustar la insulina sin lecturas." } }, - "ro" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Problemă bolus" + "value" : "Loop ei voi säätää insuliinia ilman lukemia." } }, - "ru" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Проблема с подачей болюса" + "value" : "Loop ne peut pas ajuster l'insuline sans mesures." } }, - "tr" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus Sorunu" + "value" : "Loop אינו יכול להתאים אינסולין ללא קריאות." } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "大剂量出现问题" - } - } - } - }, - "Bolus Recommendation Updated" : { - "comment" : "Alert title for an updated bolus recommendation", - "localizations" : { - "da" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Bolusanbefaling opdateret" + "value" : "A Loop értékek nélkül nem tudja módosítani az inzulint." } }, - "de" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Aktualisierte Bolusempfehlung" + "value" : "Loop non può regolare l'insulina senza letture." } }, - "es" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Recomendación de bolo fue actualicada" + "value" : "測定値がないとLoopはインスリンを調整できません。" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Bolussuositus päivitetty" + "value" : "Loop kan ikke justere insulin uten målinger." } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Recommandation de Bolus modifiée" + "value" : "Loop kan de insuline niet aanpassen zonder glucosewaarden." } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "המלצת בולוס התעדכנה" + "value" : "Loop nie może dostosowywać insuliny bez odczytów." } }, - "it" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Raccomandazioni sul bolo aggiornate" + "value" : "O Loop não consegue ajustar a insulina sem leituras." } }, - "nb" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus anbefaling er oppdatert" + "value" : "Loop nu poate ajusta insulina fără citiri." } }, - "nl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Aanbevolen bolus bijgewerkt" + "value" : "Loop не может регулировать инсулин без показаний." } }, - "pl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Zaktualizowano rekomendowanego bolusa" + "value" : "Loop nemôže upravovať inzulín bez hodnôt." } }, - "ro" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Actualizare Recomandare bolus" + "value" : "Loop kan inte justera insulinet utan glukosvärden." } }, - "ru" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Рекомендации по болюсу обновлены" + "value" : "Loop okuma olmadan insülini ayarlayamaz." } }, - "sv" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Det finns en ny bolusrekommendation" + "value" : "Loop не може регулювати інсулін без показників." } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus Önerisi Güncellendi" + "value" : "Loop không thể điều chỉnh insulin khi không có chỉ số." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "大剂量推荐值已更新" + "value" : "没有读数,Loop 无法调整胰岛素。" } } } }, - "Bolus Summary" : { - "comment" : "Title for card displaying carb entry and bolus recommendation", + "Loop didn't run" : { + "comment" : "Reason shown for a stretch of time when Loop did not complete a run and recorded no error", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لم يعمل Loop" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop neproběhl" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus-resumé" + "value" : "Loop kørte ikke" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus Zusammenfassung" + "value" : "Loop ist nicht gelaufen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Resumen del bolo" + "value" : "Loop no se ejecutó" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Bolusyhteenveto" + "value" : "Loop ei ajanut" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Résumé du bolus" + "value" : "Loop ne s'est pas exécuté" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "סיכום" + "value" : "Loop לא רץ" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A Loop nem futott" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Riepilogo bolo" + "value" : "Loop non eseguito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loopが実行されませんでした" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus oppsummering" + "value" : "Loop kjørte ikke" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bolussamenvatting" + "value" : "Loop heeft niet gedraaid" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Podsumowanie bolusa" + "value" : "Loop nie działał" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "O Loop não executou" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Rezumat Bolus" + "value" : "Loop nu a rulat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Суммарный болюс" + "value" : "Loop не запускался" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop neprebehol" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus sammanfattning" + "value" : "Loop kördes inte" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus Özeti" + "value" : "Loop çalışmadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop не запускався" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop không chạy" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "大剂量概要" + "value" : "Loop 未运行" } } } }, - "Bolus Too Small" : { - "comment" : "Alert title for a bolus too small validation error", + "Loop failed · %1$@" : { + "comment" : "Status pill on the Now screen: Loop hasn't completed for over 15 minutes. (1: duration since Loop last ran, e.g. 16m)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "فشل Loop · %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop selhal · %1$@" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus for lille" + "value" : "Loop fejlede · %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus zu gering" + "value" : "Loop fehlgeschlagen · %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo demasiado pequeño" + "value" : "Loop falló · %1$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop epäonnistui · %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus trop petit" + "value" : "Échec de Loop · %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בולוס קטן מדי" + "value" : "Loop נכשל · %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop sikertelen · %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo troppo piccolo" + "value" : "Loop non riuscito · %1$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop失敗 · %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus er for liten" + "value" : "Loop feilet · %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus te klein" + "value" : "Loop mislukt · %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Za mały bolus" + "value" : "Błąd Loop · %1$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop falhou · %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus prea mic" + "value" : "Loop eșuat · %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Болюс слишком маленький" + "value" : "Сбой Loop · %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop zlyhal · %1$@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop misslyckades · %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus Çok Küçük" + "value" : "Loop başarısız · %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Збій Loop · %1$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop lỗi · %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "大剂量太少" + "value" : "Loop 失败 · %1$@" } } } }, - "Bolus: " : { - - }, - "Bolused %1$@ of %2$@" : { - "comment" : "The format string for bolus progress. (1: delivered volume)(2: total volume)", + "Loop hasn't run for %1$@" : { + "comment" : "Notice title on the Now screen when Loop hasn't completed recently. (1: duration since Loop last ran, e.g. 16m)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تم ضخ %1$@ من %2$@" + "value" : "لم يعمل Loop منذ %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop neproběhl %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus %1$@ af %2$@" + "value" : "Loop har ikke kørt i %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ von %2$@ verabreicht" + "value" : "Loop ist seit %1$@ nicht gelaufen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Administró bolo %1$@ de %2$@" + "value" : "Loop no se ha ejecutado en %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus %1$@ / %2$@" + "value" : "Loopia ei ole ajettu %1$@ aikana" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus délivré %1$@ sur %2$@" + "value" : "Loop ne s'est pas exécuté depuis %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הוזרק %1$@ מתוך %2$@" + "value" : "Loop לא רץ כבר %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A Loop %1$@ óta nem futott" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo %1$@ di %2$@" + "value" : "Loop non eseguito da %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%2$@ のうち %1$@ ボーラス済" + "value" : "Loopが%1$@実行されていません" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus %1$@ av %2$@" + "value" : "Loop har ikke kjørt på %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ van %2$@ gebolust" + "value" : "Loop heeft %1$@ niet gedraaid" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Podano %1$@ z %2$@" + "value" : "Loop nie działa od %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Entregue %1$@ of %2$@" + "value" : "O Loop não executa há %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus administrat %1$@ of %2$@" + "value" : "Loop nu a rulat de %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Подан болюс%1$@ из %2$@" + "value" : "Loop не запускался уже %1$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Podaný bolus %1$@ z %2$@" + "value" : "Loop neprebehol %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Givit bolus %1$@ av %2$@" + "value" : "Loop har inte körts på %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İletilen Bolus %1$@ / %2$@" + "value" : "Loop %1$@ süredir çalışmadı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop не запускався вже %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Đã thực hiện Bolus %1$@ của %2$@" + "value" : "Loop đã không chạy trong %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "大剂量已输注%1$@ of %2$@" + "value" : "Loop 已 %1$@未运行" } } } }, - "Bolusing %1$@" : { - "comment" : "The format string for bolus in progress showing total volume. (1: total volume)", + "Loop keeps the last 7 days on this phone. Older doses and carbs are in Apple Health and on the Trends tab." : { + "comment" : "Logbook footer explaining why only 7 days are listed", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "يضخ %1$@" + "value" : "يحتفظ Loop بآخر 7 أيام على هذا الهاتف. الجرعات والكارب الأقدم موجودة في Apple Health وفي تبويب الاتجاهات." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop uchovává posledních 7 dní v tomto telefonu. Starší dávky a sacharidy najdete v aplikaci Zdraví a na kartě Trendy." } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus %1$@" + "value" : "Loop gemmer de seneste 7 dage på denne telefon. Ældre doser og kulhydrater findes i Apple Sundhed og på fanen Tendenser." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bolusabgabe %1$@" + "value" : "Loop speichert die letzten 7 Tage auf diesem iPhone. Ältere Dosen und KH findest Du in Apple Health und im Tab Trends." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Administrando bolo de %1$@" + "value" : "Loop guarda los últimos 7 días en este teléfono. Las dosis y carbohidratos anteriores están en Apple Salud y en la pestaña Tendencias." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Annetaan bolus %1$@" + "value" : "Loop säilyttää viimeiset 7 päivää tässä puhelimessa. Vanhemmat annokset ja hiilihydraatit ovat Apple Terveydessä ja Trendit-välilehdellä." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus en cours %1$@" + "value" : "Loop conserve les 7 derniers jours sur ce téléphone. Les doses et glucides plus anciens sont dans Apple Santé et dans l'onglet Tendances." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מזריק בולוס: %1$@" + "value" : "Loop שומר את 7 הימים האחרונים בטלפון זה. מנות ופחמימות ישנות יותר נמצאות ב-Apple Health ובלשונית המגמות." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A Loop az utolsó 7 napot őrzi meg ezen a telefonon. A régebbi adagok és szénhidrátok az Apple Egészség appban és a Trendek lapon találhatók." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo in corso %1$@" + "value" : "Loop conserva gli ultimi 7 giorni su questo telefono. Dosi e carboidrati precedenti sono in Apple Salute e nella scheda Tendenze." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ ボーラス中" + "value" : "Loopはこの端末に直近7日間を保持します。それより前の投与とカーボはAppleヘルスケアとトレンドタブにあります。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Gir bolus %1$@" + "value" : "Loop lagrer de siste 7 dagene på denne telefonen. Eldre doser og karbohydrater finner du i Apple Helse og i Trender-fanen." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bolussen %1$@" + "value" : "Loop bewaart de laatste 7 dagen op deze telefoon. Oudere doses en koolhydraten vind je in Apple Health en op het tabblad Trends." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Podawanie %1$@" + "value" : "Loop przechowuje ostatnie 7 dni na tym telefonie. Starsze dawki i węglowodany są w aplikacji Zdrowie i na karcie Trendy." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Aplicando %1$@" + "value" : "O Loop guarda os últimos 7 dias neste iPhone. Doses e carbs mais antigos estão no app Saúde e na aba Tendências." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus în administrare %1$@" + "value" : "Loop păstrează ultimele 7 zile pe acest telefon. Dozele și carbohidrații mai vechi sunt în Apple Sănătate și în fila Tendințe." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Подается болюс" + "value" : "Loop хранит последние 7 дней на этом телефоне. Более ранние дозы и углеводы — в приложении «Здоровье» и на вкладке «Тренды»." } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus sa podáva" + "value" : "Loop uchováva posledných 7 dní v tomto telefóne. Staršie dávky a sacharidy nájdete v aplikácii Zdravie a na karte Trendy." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ger bolus %1$@ " + "value" : "Loop sparar de senaste 7 dagarna på den här telefonen. Äldre doser och kolhydrater finns i Apple Hälsa och på fliken Trender." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus %1$@" + "value" : "Loop son 7 günü bu telefonda saklar. Daha eski dozlar ve karbonhidratlar Apple Health'te ve Eğilimler sekmesindedir." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop зберігає останні 7 днів на цьому телефоні. Старіші дози та вуглеводи є в програмі «Здоровʼя» і на вкладці «Тренди»." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Đang thực hiện bolus %1$@" + "value" : "Loop lưu 7 ngày gần nhất trên điện thoại này. Các liều và Carbs cũ hơn có trong Apple Health và tab Xu hướng." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@大剂量注射中" + "value" : "Loop 在此手机上保留最近 7 天的数据。更早的剂量和碳水可在 Apple 健康和“趋势”标签页中查看。" } } } }, - "Bottom row" : { - "comment" : "Live activity Bottom row configuration title", - "extractionState" : "stale", + "Loop may not be giving insulin." : { + "comment" : "Notice detail on the Now screen under a critical pump problem reported by the pump", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قد لا يقوم Loop بإعطاء الأنسولين." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop možná nepodává inzulín." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop giver muligvis ikke insulin." + } + }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Untere Zeile" + "value" : "Loop gibt möglicherweise kein Insulin ab." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Es posible que Loop no esté administrando insulina." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop ei ehkä anna insuliinia." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ligne inférieure" + "value" : "Loop n'administre peut-être pas d'insuline." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ייתכן ש-Loop אינו מספק אינסולין." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lehet, hogy a Loop nem ad inzulint." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop potrebbe non erogare insulina." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loopがインスリンを注入していない可能性があります。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Bunnrad" + "value" : "Loop gir kanskje ikke insulin." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Onderste rij" + "value" : "Loop geeft mogelijk geen insuline." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop może nie podawać insuliny." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "O Loop pode não estar entregando insulina." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Rândul de jos" + "value" : "Este posibil ca Loop să nu administreze insulină." } }, - "zh-Hans" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "底部行" + "value" : "Возможно, Loop не подаёт инсулин." } - } - } - }, - "Bottom row configuration" : { - "comment" : "Title for Bottom row configuration", - "extractionState" : "stale", - "localizations" : { - "de" : { + }, + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Konfiguration der unteren Zeile" + "value" : "Loop možno nepodáva inzulín." } }, - "fr" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Configuration de la ligne inférieure" + "value" : "Loop kanske inte ger insulin." } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Konfigurasjon av bunnraden" + "value" : "Loop insülin vermiyor olabilir." } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Onderste rij instellen" + "value" : "Можливо, Loop не подає інсулін." } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Configurația rândului de jos" + "value" : "Loop có thể không đang tiêm insulin." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "底部行配置" + "value" : "Loop 可能未在输注胰岛素。" } } } }, - "Breathing is slightly uncomfortable. Conversation requires maximal effort." : { - - }, - "Breathing more heavily. Can carry on a conversation, but requires more effort." : { - - }, - "by %@" : { - "comment" : "A label displaying the author of the podcast. The argument is the podcast's author.", - "isCommentAutoGenerated" : true - }, - "Can I use Focus modes with %1$@?" : { - "comment" : "Focus modes section title (1: app name)" - }, - "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\nThe title of the cancel button in the plugin picker", + "Loop only works out active insulin and carbs for the days it keeps" : { + "comment" : "Day page placeholder for active insulin and carbs on a day older than Loop's 7-day history", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "إلغاء" + "value" : "يحسب Loop الأنسولين والكارب النشطين فقط للأيام التي يحتفظ بها" } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Zrušit" + "value" : "Loop počítá aktivní inzulín a sacharidy jen pro dny, které uchovává" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Annuller" + "value" : "Loop beregner kun aktivt insulin og kulhydrater for de dage, den gemmer" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Abbrechen" + "value" : "Loop berechnet aktives Insulin und aktive KH nur für die gespeicherten Tage" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Cancelar" + "value" : "Loop solo calcula la insulina y los carbohidratos activos de los días que guarda" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Kumoa" + "value" : "Loop laskee aktiivisen insuliinin ja hiilihydraatit vain säilyttämilleen päiville" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Annuler" + "value" : "Loop calcule l'insuline et les glucides actifs uniquement pour les jours qu'il conserve" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בטל" + "value" : "Loop מחשב אינסולין ופחמימות פעילים רק עבור הימים שהוא שומר" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A Loop csak a megőrzött napokra számolja ki az aktív inzulint és szénhidrátot" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Annulla" + "value" : "Loop calcola insulina e carboidrati attivi solo per i giorni che conserva" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "キャンセル" + "value" : "Loopが残存インスリンと残存糖質を計算するのは、保持している日のみです" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Avbryt" + "value" : "Loop beregner bare aktivt insulin og karbohydrater for dagene den lagrer" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Annuleer" + "value" : "Loop berekent actieve insuline en koolhydraten alleen voor de dagen die het bewaart" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Anuluj" + "value" : "Loop oblicza aktywną insulinę i węglowodany tylko dla przechowywanych dni" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Cancelar" + "value" : "O Loop só calcula a insulina e os carboidratos ativos dos dias que guarda" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Anulați" + "value" : "Loop calculează insulina și carbohidrații activi doar pentru zilele pe care le păstrează" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Отмена" + "value" : "Loop рассчитывает активный инсулин и углеводы только за хранимые дни" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Zrušiť" + "value" : "Loop počíta aktívny inzulín a sacharidy len pre dni, ktoré uchováva" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Avbryt" + "value" : "Loop beräknar bara aktivt insulin och kolhydrater för de dagar som sparas" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İptal" + "value" : "Loop aktif insülini ve karbı yalnızca sakladığı günler için hesaplar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop розраховує активний інсулін і вуглеводи лише за дні, які зберігає" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Hủy bỏ" + "value" : "Loop chỉ tính insulin và Carbs còn hoạt động cho những ngày nó lưu" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "取消" + "value" : "Loop 只为其保留的日期计算活性胰岛素和碳水" } } } }, - "Cancel the manual temporary basal if you wish for the app to restart automated dosing.\n\nIf you wish for the app to automate your insulin, go to Settings and toggle Closed Loop to on." : { - "comment" : "message when automation is off and a manual temp basal is in progress" - }, - "Canceling Bolus" : { - "comment" : "The title of the cell indicating a bolus is being canceled", + "Loop prediction" : { + "comment" : "Chart legend on the Now screen: dashed line is Loop's predicted glucose", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "إلغاء الجرعة" + "value" : "توقع Loop" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predikce Loop" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Annullerer bolus" + "value" : "Loop-forudsigelse" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus abbrechen" + "value" : "Loop-Vorhersage" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Cancelando bolo" + "value" : "Predicción de Loop" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Kumotaan bolus" + "value" : "Loopin ennuste" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Annulation du Bolus en cours" + "value" : "Prédiction de Loop" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מבטל בולוס" + "value" : "תחזית Loop" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop-előrejelzés" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Annullamento bolo in corso" + "value" : "Previsione di Loop" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ボーラスをキャンセルします" + "value" : "Loopの予測" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Avbryter bolus" + "value" : "Loop-prognose" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus annuleren" + "value" : "Loop-voorspelling" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Anulowanie bolusa" + "value" : "Prognoza Loop" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Cancelando Bolus" + "value" : "Previsão do Loop" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Întrerupere bolus" + "value" : "Predicție Loop" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Отмена болюса" + "value" : "Прогноз Loop" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus sa ruší" + "value" : "Predikcia Loop" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Avbryter bolus" + "value" : "Loops prognos" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus İptal ediliyor" + "value" : "Loop tahmini" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прогноз Loop" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Hủy bỏ liều Bolus" + "value" : "Dự đoán của Loop" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "取消大剂量" + "value" : "Loop 预测" } } } }, - "Carb effects" : { - "comment" : "Details for missing data error when carb effects are missing", + "Loop predicts %1$@ %2$@ by %3$@" : { + "comment" : "VoiceOver summary of the prediction chart. (1: predicted glucose value; 2: glucose unit, mmol/L or mg/dL; 3: time of the prediction)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تأثيرات الكارب" + "value" : "يتوقع Loop %1$@ %2$@ بحلول %3$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop predikuje %1$@ %2$@ do %3$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kulhydrateffekter" + "value" : "Loop forudsiger %1$@ %2$@ kl. %3$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kohlenhydrat-Wirkungen" + "value" : "Loop sagt %1$@ %2$@ bis %3$@ voraus" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Efectos de carbohidratos" + "value" : "Loop predice %1$@ %2$@ a las %3$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Hiilihydraattivaikutus" + "value" : "Loop ennustaa %1$@ %2$@ klo %3$@ mennessä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Effets des glucides" + "value" : "Loop prévoit %1$@ %2$@ à %3$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "השפעות פחמימות" + "value" : "Loop צופה %1$@ %2$@ עד %3$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A Loop előrejelzése %3$@ időpontra: %1$@ %2$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Effetto carboidrati" + "value" : "Loop prevede %1$@ %2$@ alle %3$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "糖質効果" + "value" : "Loopの予測:%3$@までに%1$@ %2$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Karb effekter" + "value" : "Loop forventer %1$@ %2$@ kl. %3$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Koolhydraateffecten" + "value" : "Loop voorspelt %1$@ %2$@ om %3$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wpływ węglowodanów" + "value" : "Loop prognozuje %1$@ %2$@ do %3$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Efeitos Carb" + "value" : "O Loop prevê %1$@ %2$@ às %3$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Efecte carbohidrați" + "value" : "Loop prezice %1$@ %2$@ până la %3$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Влияние углеводов" + "value" : "Loop прогнозирует %1$@ %2$@ к %3$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Účinky sacharidov" + "value" : "Loop predikuje %1$@ %2$@ do %3$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kolhydrateffekter" + "value" : "Loop förutspår %1$@ %2$@ kl. %3$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Karbonhidrat etkileri" + "value" : "Loop %3$@ itibarıyla %1$@ %2$@ tahmin ediyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop прогнозує %1$@ %2$@ до %3$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "các tác động của Carb" + "value" : "Loop dự đoán %1$@ %2$@ vào lúc %3$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "碳水效果" + "value" : "Loop 预测到 %3$@ 时为 %1$@ %2$@" } } } }, - "Carb Entry" : { - "comment" : "Label for carb entry row on bolus screen", + "Loop status" : { + "comment" : "Trends card title: how long Loop spent in closed loop, limited or open loop", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حالة Loop" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stav Loop" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Indtast kulhydrater" + "value" : "Loop-status" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "KH-Eintrag" + "value" : "Loop-Status" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Entrada de Carbohidratos" + "value" : "Estado de Loop" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Hiilihydraatit" + "value" : "Loopin tila" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Entrée de glucides" + "value" : "État de Loop" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "פחמימות" + "value" : "מצב Loop" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop állapota" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidrati inseriti" + "value" : "Stato di Loop" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loopの状態" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Legg til karbohydrater" + "value" : "Loop-status" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Koolhydraatinvoer" + "value" : "Loopstatus" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadź węglowodany" + "value" : "Stan Loop" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Status do Loop" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Intrare carbohidrați" + "value" : "Starea Loop" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Добавить запись углеводов" + "value" : "Статус Loop" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stav Loop" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kolhydrater" + "value" : "Loopstatus" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Karb Girişi" + "value" : "Loop durumu" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Стан Loop" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trạng thái Loop" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "碳水记录" + "value" : "Loop 状态" } } } }, - "Carb Quantity" : { - "comment" : "Label for carb quantity row on add favorite food screen", + "Loop status is recorded from when the new interface was first opened." : { + "comment" : "Trends Loop status footnote when there is no Loop status history yet", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تُسجَّل حالة Loop منذ أول فتح للواجهة الجديدة." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stav Loop se zaznamenává od prvního otevření nového rozhraní." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop-status registreres fra første gang den nye brugerflade blev åbnet." + } + }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Menge gegessen" + "value" : "Der Loop-Status wird ab dem ersten Öffnen der neuen Oberfläche aufgezeichnet." } }, - "fr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Quantité de glucides" + "value" : "El estado de Loop se registra desde la primera vez que se abrió la nueva interfaz." } }, - "he" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "כמות פחמימות" + "value" : "Loopin tila tallennetaan siitä lähtien, kun uusi käyttöliittymä avattiin ensimmäisen kerran." } }, - "it" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidrati Assunti" + "value" : "L'état de Loop est enregistré depuis la première ouverture de la nouvelle interface." } }, - "nb" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Antall karbohydrater" + "value" : "מצב Loop נרשם מאז הפתיחה הראשונה של הממשק החדש." } }, - "nl" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Hoeveelheid koolhydraten" + "value" : "A Loop állapota az új felület első megnyitásától kerül rögzítésre." } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Cantitate carbohidrați" + "value" : "Lo stato di Loop è registrato dalla prima apertura della nuova interfaccia." } }, - "zh-Hans" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "碳水含量" + "value" : "Loopの状態は、新しいインターフェイスを初めて開いた時点から記録されます。" } - } - } - }, - "Carb Ratio" : { - - }, - "Carb Ratio Schedule" : { - "comment" : "Details for configuration error when carb ratio schedule is missing", - "localizations" : { - "da" : { + }, + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Tidsplan for kulhydratforhold" + "value" : "Loop-status registreres fra første gang det nye grensesnittet ble åpnet." } }, - "de" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Zeitplan für das Kohlenhydratverhältnis" + "value" : "De loopstatus wordt vastgelegd vanaf het moment dat de nieuwe interface voor het eerst werd geopend." } }, - "es" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Calendario de ratio de carbohidratos" + "value" : "Stan Loop jest zapisywany od pierwszego otwarcia nowego interfejsu." } }, - "fr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Programme des ratios Insuline-Glucides" + "value" : "O status do Loop é registrado desde a primeira vez que a nova interface foi aberta." } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Tabella del rapporto carboidrati" + "value" : "Starea Loop este înregistrată de la prima deschidere a noii interfețe." } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Tidsplan for karbohydratforhold" + "value" : "Статус Loop записывается с первого открытия нового интерфейса." } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Koolhydraatratioschema" + "value" : "Stav Loop sa zaznamenáva od prvého otvorenia nového rozhrania." } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Harmonogram Współczynnika Węglowodanowego" + "value" : "Loopstatus registreras från när det nya gränssnittet först öppnades." } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Programul raportului de carbohidrați" + "value" : "Loop durumu, yeni arayüzün ilk açıldığı andan itibaren kaydedilir." } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Расписание соотношения углеводов" + "value" : "Стан Loop записується з першого відкриття нового інтерфейсу." } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Karb Oranı Programı" + "value" : "Trạng thái Loop được ghi lại từ khi giao diện mới được mở lần đầu." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "碳水系数配置表" + "value" : "Loop 状态从首次打开新界面时开始记录。" } } } }, - "Carb Ratios" : { - "comment" : "The title of the carb ratios schedule screen\n The title text for the carb ratio schedule", - "extractionState" : "manual", + "Loop trends" : { + "comment" : "Title of the exported Trends PDF report", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "معاملات الكارب" + "value" : "اتجاهات Loop" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Kulhydratforhold" + "value" : "Trendy Loop" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "KH-Verhältnis" + "value" : "Loop-tendenser" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Carb Ratios" + "value" : "Loop-Trends" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ratios de carbohidratos" + "value" : "Tendencias de Loop" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Hiilihydraattisuhteet" + "value" : "Loop-trendit" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ratios Insuline-Glucides" + "value" : "Tendances Loop" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Carb Ratios" + "value" : "מגמות Loop" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop-trendek" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Rapporti carboidrati" + "value" : "Tendenze Loop" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Carb Ratios" + "value" : "Loopトレンド" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Karb forhold" + "value" : "Loop-trender" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Koolhydraatratio's" + "value" : "Loop-trends" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Współczynniki węglowodanowe" + "value" : "Trendy Loop" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Taxas de Carbs" + "value" : "Tendências do Loop" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Raport carbohidrați insulină" + "value" : "Tendințe Loop" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Соотношения углеводов" + "value" : "Тренды Loop" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Inzulínovo sacharidový pomer" + "value" : "Trendy Loop" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinkvoter" + "value" : "Loop-trender" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Karbonhidrat Oranları" + "value" : "Loop eğilimleri" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тренди Loop" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Carb Ratios" + "value" : "Xu hướng Loop" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "碳水化合物系数" + "value" : "Loop 趋势" } } } }, - "carb-entry-title-add" : { - "comment" : "The title of the view controller to create a new carb entry", - "extractionState" : "extracted_with_value", + "Loop trends %1$@" : { + "comment" : "File name of an exported Trends report or CSV, without the extension. (1: date range of the period)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Add Carb Entry" + "value" : "اتجاهات Loop %1$@" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Tilføj kulhydrater" + "value" : "Trendy Loop %1$@" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kohlenhydrate hinzufügen" + "value" : "Loop-tendenser %1$@" } }, - "en" : { + "de" : { "stringUnit" : { - "state" : "new", - "value" : "Add Carb Entry" + "state" : "translated", + "value" : "Loop-Trends %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Agregar Entrada de Carb" + "value" : "Tendencias de Loop %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Lisää hiilihydraatteja" + "value" : "Loop-trendit %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter des glucides" + "value" : "Tendances Loop %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הוספת רשומת פחמימות" + "value" : "מגמות Loop %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop-trendek %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Aggiungi inserimento carboidrati" + "value" : "Tendenze Loop %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "糖質の記入を追加" + "value" : "Loopトレンド %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Legg inn karbohydrater" + "value" : "Loop-trender %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Koolhydraten toevoegen" + "value" : "Loop-trends %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadź węglowodany" + "value" : "Trendy Loop %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Adicionar Carb" + "value" : "Tendências do Loop %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Adăugați carbohidrați" + "value" : "Tendințe Loop %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Добавить запись углеводов" + "value" : "Тренды Loop %1$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Zadať sacharidy" + "value" : "Trendy Loop %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Lägg till kolhydrater" + "value" : "Loop-trender %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Karb Girişi Ekle" + "value" : "Loop eğilimleri %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тренди Loop %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Khai báo Carb" + "value" : "Xu hướng Loop %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "添加碳水摄入" + "value" : "Loop 趋势 %1$@" } } } }, - "Carbohydrate Entry Too Large" : { - "comment" : "Title for bolus screen warning when carbohydrate entry is too large", + "Loop · %lld changes · tap to list" : { + "comment" : "Logbook basal adjustments row subtitle: how many temp basals Loop set in the day; tapping lists them. (1: number of changes)", "localizations" : { + "en" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld change · tap to list" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld changes · tap to list" + } + } + } + } + }, + "ar" : { + "variations" : { + "plural" : { + "zero" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld تغيير · اضغط للعرض" + } + }, + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld تغيير · اضغط للعرض" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld تغيير · اضغط للعرض" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld تغييرات · اضغط للعرض" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld تغييرًا · اضغط للعرض" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld تغيير · اضغط للعرض" + } + } + } + } + }, + "cs" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld změna · klepněte pro seznam" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld změny · klepněte pro seznam" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld změny · klepněte pro seznam" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld změn · klepněte pro seznam" + } + } + } + } + }, "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kulhydratindtastning for stor" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld ændring · tryk for liste" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld ændringer · tryk for liste" + } + } + } } }, "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "KH-Eintrag zu groß" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld Änderung · tippen für Liste" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld Änderungen · tippen für Liste" + } + } + } } }, "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrada de carbohidratos demasiado grande" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld cambio · toca para ver" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld cambios · toca para ver" + } + } + } + } + }, + "fi" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld muutos · näytä napauttamalla" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld muutosta · näytä napauttamalla" + } + } + } } }, "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Les glucides saisis sont trop important" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld modification · touchez pour la liste" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld modifications · touchez pour la liste" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld modifications · touchez pour la liste" + } + } + } } }, "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "כמות פחמימות גדולה מדי" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld שינוי · הקש לרשימה" + } + }, + "two" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld שינויים · הקש לרשימה" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld שינויים · הקש לרשימה" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld שינויים · הקש לרשימה" + } + } + } + } + }, + "hu" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld módosítás · koppints a listához" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld módosítás · koppints a listához" + } + } + } } }, "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carboidrati inseriti troppo alti" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld modifica · tocca per l'elenco" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld modifiche · tocca per l'elenco" + } + } + } + } + }, + "ja" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld件の変更 · タップで一覧表示" + } + } + } } }, "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Karbohydratinntaket er for stort" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld endring · trykk for liste" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld endringer · trykk for liste" + } + } + } } }, "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Koolhydraatinvoer te veel" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld wijziging · tik voor lijst" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld wijzigingen · tik voor lijst" + } + } + } } }, "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wpis węglowodanów za duży" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld zmiana · stuknij, aby wyświetlić" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld zmiany · stuknij, aby wyświetlić" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld zmian · stuknij, aby wyświetlić" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld zmiany · stuknij, aby wyświetlić" + } + } + } + } + }, + "pt-BR" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld alteração · toque para listar" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld alterações · toque para listar" + } + } + } } }, "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intrarea de carbohidrați este prea mare" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld modificare · atingeți pentru listă" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld modificări · atingeți pentru listă" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld de modificări · atingeți pentru listă" + } + } + } } }, "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Слишком много углеводов" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld изменение · нажмите для списка" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld изменения · нажмите для списка" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld изменений · нажмите для списка" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld изменения · нажмите для списка" + } + } + } + } + }, + "sk" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld zmena · klepnite pre zoznam" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld zmeny · klepnite pre zoznam" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld zmeny · klepnite pre zoznam" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld zmien · klepnite pre zoznam" + } + } + } + } + }, + "sv" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld ändring · tryck för lista" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld ändringar · tryck för lista" + } + } + } } }, "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Karbonhidrat Girişi Çok Büyük" + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld değişiklik · listelemek için dokunun" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld değişiklik · listelemek için dokunun" + } + } + } + } + }, + "uk" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld зміна · торкніться для списку" + } + }, + "few" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld зміни · торкніться для списку" + } + }, + "many" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld змін · торкніться для списку" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld зміни · торкніться для списку" + } + } + } + } + }, + "vi" : { + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld thay đổi · chạm để xem danh sách" + } + } + } } }, "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "碳水化合物输入量过大" + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loop · %lld次更改 · 轻点查看列表" + } + } + } } } } }, - "Carbohydrates" : { - "comment" : "Health access row label for carbohydrates\nLabel for carbohydrates entry row on simple bolus screen\nTitle of the prediction input effect for carbohydrates", + "High Glucose" : { "localizations" : { - "ar" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "الكربوهيدرات" + "value" : "Høj glukose" } }, - "da" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kulhydrater" + "value" : "Hoher Blutzucker" } }, - "de" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Kohlenhydrate" + "value" : "Glycémie élevée" } }, - "es" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidratos" + "value" : "Glicemia alta" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Hiilihydraatit" + "value" : "Høyt glukosenivå" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Glucides" + "value" : "Hoge glucose" } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "פחמימות" + "value" : "Wysoki poziom glukozy" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidrati" + "value" : "Glicemie ridicată" } }, - "ja" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "残存糖質" + "value" : "Высокий уровень глюкозы" } }, - "nb" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Karbohydrater" + "value" : "高血糖" } - }, - "nl" : { + } + } + }, + "High Intensity (Anaerobic)" : { + + }, + "High-intensity exercise means pushing yourself to your **maximum effort**. It is so hard that talking is nearly impossible, and you can’t keep it up for very long." : { + + }, + "Hiking" : { + + }, + "Historical Data" : { + + }, + "Horizon" : { + "comment" : "A label for the \"Horizon\" setting in the glucose alert settings view.", + "isCommentAutoGenerated" : true + }, + "How can I silence non-Critical Alerts?" : { + "localizations" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Koolhydraten" + "value" : "Hvordan kan jeg slå ikke-kritiske alarmer fra?" } }, - "pl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Węglowodany" + "value" : "Wie kann ich nicht kritische Warnungen stummschalten?" } }, - "pt-BR" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidratos" + "value" : "Comment puis-je faire taire les alertes auditives non-critiques?" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidrați" + "value" : "Come posso silenziare gli avvisi non critici?" } }, - "ru" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Углеводы" + "value" : "Hvordan kan jeg dempe ikke-kritiske varsler?" } }, - "sk" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Sacharidy" + "value" : "Hoe demp ik niet-kritieke waarschuwingen?" } }, - "sv" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Kolhydrater" + "value" : "Jak mogę wyciszyć alerty niekrytyczne?" } }, - "tr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Karbonhidratlar" + "value" : "Cum pot dezactiva sunetul alertelor non-critice?" } }, - "vi" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohydrates" + "value" : "Как отключить некритичные оповещения?" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "碳水化合物" + "value" : "如何关闭非关键警报?" } } } }, - "Carbs Absorbed (g) ÷ Carb Ratio (g/U) × Insulin Sensitivity (%1$@/U)" : { - "comment" : "Description of the prediction input effect for carbohydrates. (1: The glucose unit string)", + "How can I silence only Time Sensitive and Non-Critical alerts?" : { + "extractionState" : "stale", "localizations" : { - "ar" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "الكارب الذي تم امتصاصه (جرام) ÷ معامل الكارب (جرام لكل وحدة) × حاسية الأنسولين (%1$@/وحدة)" + "value" : "Hvordan kan jeg kun slå lyden fra for tidsfølsomme og ikke-kritiske advarsler?" } }, - "da" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kulhydrater absorberet (g) ÷ Kulhydratratio (g/E) × Insulinfølsomhed (%1$@/E)" + "value" : "Wie kann ich nur zeitkritische und nicht kritische Warnungen stummschalten?" } }, - "de" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Resorbierte Kohlenhydrate (g) ÷ Kohlenhydratfaktor (g/IE) × Insulinempfindlichkeit (%1$@/IE)" + "value" : "Comment puis-je faire taire uniquement les alertes urgentes et non-critiques?" } }, - "es" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidratos absorbidos (gr) ÷ Relación de Carbohidratos (gr/U) x Sensibilidad a Insulina (%1$@/U)" + "value" : "Come posso silenziare solo gli avvisi sensibili al tempo e non critici?" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Imeytyneet hiilihydraatit (g) ÷ Hiilihydraattisuhde (g/U) × Insuliiniherkkyys (%1$@/U)" + "value" : "Hvordan kan jeg deaktivere kun tidssensitive og ikke-kritiske varsler?" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Glucides Absorbés (g) ÷ Ratio Glucides (g/U) x Sensibilité à l'insuline (%1$@/U)" + "value" : "Hoe demp ik alleen tijdgevoelige en niet-kritieke waarschuwingen?" } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Carbs Absorbed (g) ÷ Carb Ratio (g/U) × Insulin Sensitivity (%1$@/U)" + "value" : "Jak wyciszyć tylko alerty zależne od czasu i niekrytyczne?" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Carboidrati assorbiti ÷ Rapporto carboidrati (gr/U) × Sensibilità insulinica (%1$@/U)" + "value" : "Cum pot dezactiva sunetul doar alertelor urgente și non-critice?" } }, - "ja" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "吸収済糖質(g) ÷ 糖質比 (g/U) × インスリン効果値(%1$@/U)" + "value" : "Как отключить только срочные и некритические предупреждения?" } }, - "nb" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Absorberte karbohydrater (g) ÷ Karbforhold (g/E) × insulinfølsomhet ( %1$@ /E)" + "value" : "如何仅屏蔽“时效性”和“非关键”警报?" } - }, - "nl" : { + } + } + }, + "How can I temporarily silence all %1$@ app sounds?" : { + "comment" : "Title text for temporarily silencing all sounds (1: app name)", + "localizations" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Opgenomen koolhydraten (g) ÷ koolhydraatratio (g/E) × insulinegevoeligheid (%1$@/E)" + "value" : "Hvordan kan jeg midlertidigt slå lyden fra for alle %1$@ applyde?" } }, - "pl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ilość węglowodanów (g) ÷ stosunek węglowodanów (g/J) × czułość insuliny (%1$@/J)" + "value" : "Wie kann ich alle Töne der %1$@ App vorübergehend stummschalten?" } }, - "pt-BR" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Carbs Absorvidos (g) ÷ Relação Carb (g/U) × Sensibilidade a Insulina (%1$@/U)" + "value" : "Comment puis-je désactiver temporairement tous les sons de l'application %1$@?" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Carbohidrați absorbiți (g) ÷ Raport carbohidrați (g/U) × Factor de sensibilitate la insulină (%1$@/U)" + "value" : "Come posso silenziare temporaneamente tutti i suoni dell'app %1$@ ?" } }, - "ru" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Усвоенные углеводы (г) ÷ Коэффициент углеводов (г/U) × Чувствительность к инсулину (%1$@/U)" + "value" : "Hvordan kan jeg midlertidig dempe alle %1$@-applydene?" } }, - "sk" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Absorbované sacharidy (g) ÷ Inzulínovo sacharidový pomer (g/j) × Faktor citlivosti na inzulín (%1$@/j)" + "value" : "Hoe demp ik tijdelijk alle geluiden van de %1$@-app?" } }, - "sv" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Absorberade kolhydrater (g) ÷ Insulinkvot (g/E) × Insulinkänslighet (%1$@/E)" + "value" : "Jak mogę tymczasowo wyciszyć wszystkie dźwięki aplikacji %1$@ ?" } }, - "tr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Emilen Karb. (gr) ÷ Karb. Oranı (gr/Ü) × İnsulin duyarlılığı (%1$@/Ü)" + "value" : "Cum pot dezactiva temporar toate sunetele aplicației %1$@?" } }, - "vi" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Khối lượng carb tiêu thụ (g) ÷ Tỷ lệ Carb (g/U) × Độ nhạy của Insulin (%1$@/U)" + "value" : "Как временно отключить все звуки приложения %1$@?" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "已吸收碳水化合物(克)÷碳水化合物吸收率(克 / 单位)×胰岛素敏感系数 (%1$@/单位)" + "value" : "如何暂时关闭 %1$@ 应用中的所有声音?" } } } }, - "Caution" : { + "How does her preset impact her bolus recommendation?" : { + + }, + "How to configure each setting" : { + + }, + "How to update (LoopDocs)" : { + "comment" : "The title text for how to update", "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jak aktualizovat (LoopDocs)" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Forsigtig" + "value" : "Sådan opdaterer du (LoopDocs)" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Achtung" + "value" : "Wie man aktualisiert (LoopDocs)" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cómo actualizar (LoopDocs)" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Attention" + "value" : "Comment mettre à jour (LoopDocs)" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "זהירות" + "value" : "כיצד לעדכן (LoopDocs)" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Attenzione" + "value" : "Come Aggiornare (LoopDocs)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Forsiktig" + "value" : "Hvordan oppdatere (LoopDocs)" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voorzichtig" + "value" : "Hoe bij te werken (LoopDocs)" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Uwaga" + "value" : "Jak zaktualizować (LoopDocs)" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Atenție" + "value" : "Cum se actualizează (LoopDocs)" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Как обновить (LoopDocs)" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nasıl güncellenir (LoopDocs)" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "注意" + "value" : "如何更新(LoopDocs)" } } } }, - "CAUTION - Investigational device. Limited by Federal (or United States) law to investigational use." : { + "How to use Presets for everyday activities" : { }, - "CGM Active" : { - "comment" : "Percent of time CGM data present metric title" + "How to use Presets for exercise" : { + }, - "Change the pump battery immediately" : { - "comment" : "The notification alert describing a low pump battery", + "How to use Presets when you are sick" : { + + }, + "https://mysite.herokuapp.com" : { + "comment" : "The placeholder text for the nightscout site URL credential", "extractionState" : "manual", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "قم بتغيير بطارية المضخة على الفور" - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Udskift pumpebatteri omgående" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wechsel sofort die Pumpenbatterie" - } - }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Change the pump battery immediately" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cambie la batería de la bomba de inmediato" + "value" : "https://mysite.herokuapp.com" } - }, - "fi" : { + } + } + }, + "I'm a tester" : { + "comment" : "Button that dismisses the development build warning", + "localizations" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Vaihda pumpun paristo välittömästi" + "value" : "Ich bin ein Tester" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Changer immédiatement la pile de la pompe" + "value" : "Je suis un testeur" } }, - "he" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Change the pump battery immediately" + "value" : "Jeg er en tester" } }, - "it" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Sostituisci immediatamente la batteria della pompa" + "value" : "Ik ben een tester" } }, - "ja" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "すぐにポンプの電池を替えてください" + "value" : "Sunt un tester" } }, - "nb" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Skift pumpebatteriet umiddelbart" + "value" : "我是一名测试员" } - }, - "nl" : { + } + } + }, + "if eating less than 2 hours before exercise" : { + + }, + "If glucose drops below 126 mg/dL" : { + + }, + "If iOS Focus Mode is ON and Mute Alerts is OFF, Critical Alerts will still be delivered and non-Critical Alerts will be silenced until %1$@ is added to each Focus mode as an Allowed App." : { + "comment" : "Focus modes descriptive text (1: app name)", + "extractionState" : "stale", + "localizations" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Vervang direct de batterij van de pomp" + "value" : "Hvis iOS-fokustilstand er slået TIL, og Slå lyden fra-advarsler er slået fra, leveres kritiske advarsler stadig, og ikke-kritiske advarsler slås fra, indtil %1$@ føjes til hver fokustilstand som en tilladt app." } }, - "pl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Natychmiast wymienić baterię pompy" + "value" : "Wenn der iOS-Fokusmodus aktiviert und die Stummschaltung von Warnungen deaktiviert ist, werden kritische Warnungen weiterhin übermittelt und nicht kritische Warnungen stummgeschaltet, bis %1$@ jedem Fokusmodus als zulässige App hinzugefügt wird." } }, - "pt-BR" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Troque a bateria da bomba imediatamente" + "value" : "Si le mode Concentration d'iOS est activé et que les Alertes Muettes sont désactivées, les Alertes Critiques seront toujours livrées et les Alertes non Critiques seront silencieuses jusqu'à ce que %1$@ soit ajouté à chaque mode Concentration en tant qu'application autorisée." } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Schimbați imediat bateria pompei" + "value" : "Se la modalità Focus iOS è attiva e Disattiva avvisi è disattivata, gli avvisi critici verranno comunque inviati e gli avvisi non critici verranno silenziati finché %1$@ non verrà aggiunto a ciascuna modalità Focus come app consentita." } }, - "ru" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Немедленно замените батарейку в помпе" + "value" : "Hvis iOS Focus Mode er PÅ og Mute Alerts er AV, vil kritiske varsler fortsatt bli levert og ikke-kritiske varsler vil bli dempet inntil %1$@ er lagt til i hver Focus Mode som en tillatt app." } }, - "sk" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ihneď vymeňte batériu pumpy" + "value" : "Als een iOS-focusmodus AAN staat en Waarschuwingen dempen UIT, worden Kritieke meldingen nog steeds afgeleverd. Niet-kritieke waarschuwingen blijven stil totdat %1$@ in elke focusmodus als toegestane app is toegevoegd." } }, - "sv" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Byt pumpbatteri nu" + "value" : "Jeśli tryb skupienia w systemie iOS jest włączony, a opcja Wycisz alerty jest wyłączona, alerty krytyczne będą nadal dostarczane, a alerty niekrytyczne będą wyciszane, dopóki %1$@ nie zostanie dodany do każdego trybu skupienia jako dozwolona aplikacja." } }, - "tr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Pompa pilini hemen değiştirin" + "value" : "Dacă modul Focus iOS este ACTIVAT și opțiunea Dezactivare alerte este DEZACTIVATĂ, alertele critice vor fi transmise în continuare, iar alertele non-critice vor fi dezactivate până când %1$@ este adăugat la fiecare mod Focus ca aplicație permisă." } }, - "vi" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Thay pin máy bơm ngay" + "value" : "Если режим фокусировки iOS включен, а функция отключения оповещений выключена, критические оповещения будут по-прежнему доставляться, а некритические будут глушиться до тех пор, пока %1$@ не будет добавлен в каждый режим фокусировки в качестве разрешенного приложения." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "立即更换胰岛素泵电池" + "value" : "如果 iOS 专注模式处于开启状态,且“静音提醒”处于关闭状态,则关键提醒仍会正常推送,而非关键提醒将被静音,直到将 %1$@ 添加到每个专注模式的“允许的应用”列表中为止。" } } } }, - "Change the pump reservoir now" : { - "comment" : "The notification alert describing an empty pump reservoir", - "extractionState" : "manual", + "If you expect your glucose to rise during the activity, you may not need a preset." : { + + }, + "If you have active insulin in your body when you start exercising, you generally have an increased risk of low glucose." : { + + }, + "If you haven’t noticed a rise in glucose with high-intensity exercise, it may be due to:" : { + + }, + "If you often experience low glucose, you may need to reduce how much insulin you deliver for meals eaten 1-2 hours before exercising." : { + + }, + "If you usually experience lows while exercising, watch your glucose levels closely during exercise and consider eating around 3 to 20g of fast-acting carbs." : { + + }, + "If your activity has a higher risk of low glucose, start a physical activity preset at least **1 hour before you begin** and keep it on until you finish." : { + + }, + "If your glucose goes down, you may only need a small decrease in insulin — less than you would for low to moderate-intensity activity." : { + + }, + "If your glucose goes up, you may only need a small increase in insulin — less than you would for high-intensity activity." : { + + }, + "If your glucose isn't dropping, eating too many carbs can raise your blood sugar, trigger more insulin, and increase the risk of low blood sugar during or after the activity." : { + + }, + "Immediate" : { + "comment" : "Immediate Delivery status text", "localizations" : { - "ar" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "قم بتغيير خزان المضخة الآن" + "value" : "Akut" } }, - "da" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Skift pumpereservoir nu" + "value" : "Sofort" } }, - "de" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Wechsel jetzt das Pumpenreservoir" + "value" : "Inmediato" } }, - "en" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Change the pump reservoir now" + "value" : "Immédiat" } }, - "es" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Cambie el depósito de la bomba ahora" + "value" : "Immediato" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Vaihda pumpun säiliö" + "value" : "Umiddelbar" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Changer maintenant le réservoir de la pompe" + "value" : "Onmiddellijk" } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Change the pump reservoir now" + "value" : "Natychmiastowy" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Cambia ora il serbatoio della pompa" + "value" : "Imediat" } }, - "ja" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "ポンプのレザーバを替えてください" + "value" : "Немедленно" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bytt pumpereservoar nå" + "value" : "Acilen" } }, - "nl" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Vervang het pompreservoir nu" + "value" : "实时" } - }, - "pl" : { + } + } + }, + "In future versions of Loop these experiments may change, end up as standard parts of the Loop Algorithm, or be removed from Loop entirely. Please follow along in the Loop Zulip chat to stay informed of possible changes to these features." : { + "comment" : "Algorithm Experiments description second paragraph.", + "localizations" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Zmień zbiorniczek w pompie" + "value" : "I fremtidige versioner af Loop kan disse eksperimenter ændre sig, ende som standarddele af Loop-algoritmen eller blive fjernet helt fra Loop. Følg med i Loop Zulip-chatten for at holde dig informeret om mulige ændringer af disse funktioner." } }, - "pt-BR" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Troque o reservatório da bomba agora" + "value" : "In zukünftigen Versionen von Loop können sich diese Experimente ändern, als Standardbestandteile des Loop-Algorithmus enden oder vollständig aus Loop entfernt werden. Bitte folgen Sie dem Loop Zulip-Chat, um über mögliche Änderungen dieser Funktionen auf dem Laufenden zu bleiben." } }, - "ro" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Schimbați rezervorul pompei acum" + "value" : "Dans les futures versions de Loop, ces essais peuvent changer, devenir des parties standard de l'algorithme Loop, ou être complètement retirées de Loop. Veuillez suivre le chat Zulip de Loop pour rester informé des éventuels changements sur ces fonctionnalités." } }, - "ru" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Замените резервуар помпы сейчас" + "value" : "Nelle versioni future di Loop questi esperimenti potrebbero cambiare, diventare parti standard dell'algoritmo Loop o essere rimossi completamente da Loop. Segui la chat di Loop Zulip per rimanere informato su possibili modifiche a queste funzionalità." } }, - "sk" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ihneď vymeňte zásobník pumpy" + "value" : "I fremtidige versjoner av Loop kan disse eksperimentene endres, ende opp som standarddeler av Loop-algoritmen eller fjernes helt fra Loop. Følg med i Loop Zulip-chatten for å holde deg informert om eventuelle endringer i disse funksjonene." } }, - "sv" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Byt pumpreservoar nu" + "value" : "In toekomstige versies van Loop kunnen deze experimenten veranderen, een vast onderdeel van het Loop-algoritme worden of helemaal uit Loop verdwijnen. Volg de Loop Zulip-chat om op de hoogte te blijven van mogelijke wijzigingen aan deze functies." } }, - "tr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pompa rezervuarını şimdi değiştirin" + "value" : "W przyszłych wersjach Loop te eksperymenty mogą się zmienić, stać się standardowymi częściami algorytmu Loop lub zostać całkowicie usunięte z Loop. Śledź czat Loop Zulip, aby być na bieżąco z możliwymi zmianami w tych funkcjach." } }, - "vi" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Thay ngăn chứa insulin bây giờ" + "value" : "În versiunile viitoare ale Loop, aceste experimente se pot schimba, pot deveni părți standard ale algoritmului Loop sau pot fi eliminate complet din Loop. Vă rugăm să urmăriți mesageria Loop Zulip pentru a fi la curent cu posibilele modificări ale acestor funcții." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "立即更换储药器" + "value" : "在 Loop 的未来版本中,这些实验性功能可能会发生变化,可能会成为 Loop 算法的标准组成部分,也可能会被完全移除。请关注 Loop 的 Zulip 聊天频道,以便及时了解这些功能可能发生的变化。" } } } }, - "Changing it can lower the chance of your glucose levels going too low if you expect unusual changes." : { + "In Range" : { + "comment" : "Time-in-range band label (70–180 mg/dL)" + }, + "Includes basal and automated boluses" : { }, - "Check for potential communication issues with your CGM.\n\nIn the meantime, your pump is still able to deliver insulin." : { - "comment" : "message when automation is off and CGM is in signal loss" + "increase" : { + }, - "Check settings" : { - "comment" : "Details for configuration error when one or more loop settings are missing", + "Increased Delivery" : { + + }, + "Indefinitely" : { + "comment" : "The title of a target alert action specifying an indefinitely long workout targets duration", "extractionState" : "manual", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تأكد من الإعدادات" + "value" : "إلى أجل غير مسمى" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kontroller indstillinger" + "value" : "Uendelig" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Überprüfe die Einstellungen." + "value" : "Unbegrenzt" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Check settings" + "value" : "Indefinitely" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Verificar ajustes" + "value" : "Indefinidamente" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Tarkista asetukset" + "value" : "Toistaiseksi" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Vérifier les paramètres" + "value" : "Indéfiniment" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Check settings" + "value" : "Indefinitely" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Controlla le impostazioni" + "value" : "Indefinitamente" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "設定を確認する" + "value" : "無期限" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Sjekk innstillinger" + "value" : "På ubestemt tid" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Controleer instellingen" + "value" : "Voor onbepaalde tijd" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Sprawdź ustawienia" + "value" : "Niemożliwy do określenia" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Verifique as configurações" + "value" : "Indefinidamente" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Verificați setările" + "value" : "Nedeterminat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Проверьте настройки" + "value" : "На неопределенное время" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kontrollera inställningarna" + "value" : "Oändligt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Ayarları kontrol et" + "value" : "Süresiz" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Kiểm tra các cài đặt" + "value" : "Vô hạn định" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "检查设置" + "value" : "永久" } } } }, - "Check that your pump is in range" : { - "comment" : "Recovery suggestion when reservoir data is missing", - "extractionState" : "manual", + "Information" : { "localizations" : { - "ar" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "تأكد أن المضخة في النطاق" + "value" : "Information" } }, - "da" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Kontroller, at din pumpe er indenfor rækkevidde" + "value" : "Information" } }, - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Stelle sicher, dass sich Deine Pumpe in Reichweite befindet." + "value" : "Informasjon" } }, - "en" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Check that your pump is in range" + "value" : "Informatie" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Informații" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "信息" + } + } + } + }, + "Insulin" : { + "comment" : "Health access row label for insulin\nTitle of the prediction input effect for insulin", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الأنسولين" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulin" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulin" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Verifique que su microinfusora esté dentro del rango" + "value" : "Insulina" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Tarkista, että pumppu on riittävän lähellä" + "value" : "Insuliini" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Vérifier que votre pompe est à portée" + "value" : "Insuline" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Check that your pump is in range" + "value" : "Insulin" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Controlla che la pompa sia nel raggio d'azione" + "value" : "Insulina" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ポンプが近くにあることを確認してください" + "value" : "インスリン" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Sjekk at pumpen din er innenfor rekkevidde" + "value" : "Insulin" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Controleer of je pomp binnen bereik is" + "value" : "Insuline" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Upewnij się, że Twoja pompa jest w zasięgu" + "value" : "Insulina" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Verifique se sua bomba está dentro do alcance" + "value" : "Insulina" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Verificați că pompa este în apropriere" + "value" : "Insulină" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Убедитесь, что помпа в зоне коммуникации" + "value" : "Инсулин" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kontrollera att pumpen är inom räckhåll" + "value" : "Insulin" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Pompanızın menzil içinde olup olmadığını kontrol edin" + "value" : "İnsülin" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Kiểm tra máy bơm đang trong phạm vi cho phép" + "value" : "Thuốc Insulin" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "请检查你的泵是否在范围内" + "value" : "胰岛素" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulín" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulin" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulín" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Інсулін" } } } }, - "Check your CGM data source" : { - "comment" : "Recovery suggestion when glucose data is missing", + "Insulin Absorbed (U) × Insulin Sensitivity (%1$@/U)" : { + "comment" : "Description of the prediction input effect for insulin", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تأكد من مصدر قراءات السكر المستمرة" + "value" : "الأنسولين الذي تم امتصاصه (وحدات) × حساسيو الأنسولين (%1$@/وحدة)" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kontroller din CGM-datakilde" + "value" : "Insulin absorberet (E) × Insulinfølsomhed (%1$@/E)" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Überprüfe Deine CGM-Datenquelle." + "value" : "Resorbiertes Insulin (IE) × Insulinempfindlichkeit (%1$@/IE)" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Verifique su fuente de datos CGM" + "value" : "Insulina Absorbida (U) x Sensibilidad a Insulina (%1$@/U)" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Tarkista CGM-tietolähde" + "value" : "Imeytynyt insuliini (U) × Insuliiniherkkyys (%1$@/U)" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Vérifier votre source de données CGM" + "value" : "Insuline Absorbée (U) × Sensibilité à l'Insuline (%1$@/U)" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בדוק את מקור המידע שלך בחיישן" + "value" : "Insulin Absorbed (U) × Insulin Sensitivity (%1$@/U)" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Controlla la sorgente dati del sensore" + "value" : "Insulina assorbita (U) × Sensibilità insulinica (%1$@/U)" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "CGM データソースを確認してください" + "value" : "吸収済インスリン(U) × インスリン効果値(%1$@/U)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Sjekk CGM" + "value" : "Insulin absorbert (E) × insulinfølsomhet ( %1$@ /E)" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Controleer je CGM gegevensbron" + "value" : "Opgenomen insuline (E) x insulinegevoeligheid (%1$@/E)" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Sprawdź swój CGM" + "value" : "Insulina podana (U) × czułość insuliny (%1$@/J)" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Verifique seu dispositivo CGM" + "value" : "Insulina Absorvida (U) × Sensibilidade a Insulina (%1$@/U)" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Verificați sursa de date a senzorului de glicemie" + "value" : "Insulină absorbită (U) × factor de sensibilitate la insulină (%1$@/U)" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Проверьте источник мониторинга СК" + "value" : "Усвоенный инсулин (U) × Чувствительность к инсулину (%1$@/U)" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kontrollera din CGM:s datakälla" + "value" : "Insulin absorberat (E) × Insulinkänslighet (%1$@/E)" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "CGM veri kaynağınızı kontrol edin" + "value" : "Emilen İnsulin (Ü) × İnsulin Duyarlılığı (%1$@/Ü)" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Kiểm tra nguồn dữ liệu CGM của bạn" + "value" : "Lượng insulin tiêu hao (U) × Độ nhạy của insulin (%1$@/U)" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "请检查你的动态血糖数据来源" + "value" : "已吸收胰岛素×胰岛素敏感系数" } } } }, - "Check your device time and/or remove any invalid data from Apple Health." : { - "comment" : "Caption for bolus screen notice when glucose data is in the future", + "Insulin adjustments have been disabled!" : { + "comment" : "Notification body for crash recovery alert", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Tjek din enheds tid og/eller fjern ugyldige data fra Apple Health." + "value" : "Insulinjusteringer er blevet deaktiveret!" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Überprüfe die Uhrzeit deines Geräts und/oder entferne alle ungültigen Daten aus Apple Health." + "value" : "Die Insulinanpassung wurde deaktiviert!" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Compruebe la hora de su dispositivo y/o elimine cualquier dato no válido de Apple Health." + "value" : "¡Se han deshabilitado los ajustes de insulina!" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Vérifiez l'heure de votre appareil et/ou supprimez toute donnée invalide d'Apple Health." + "value" : "Les ajustements d’insuline ont été désactivés!" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Controlla l'orario del tuo dispositivo e/o rimuovi eventuali dati non validi da Apple Salute." + "value" : "Le regolazioni dell'insulina sono state disattivate!" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Sjekk enhetens klokke og/ eller fjern eventuelle ugyldige data fra Apple Helse." + "value" : "Insulinjusteringer er deaktivert!" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Controleer de tijd op je apparaat en/of verwijder eventuele ongeldige invoer uit Apple Gezondheid." + "value" : "Insulineaanpassingen zijn uitgeschakeld!" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Sprawdź czas urządzenia i/lub usuń wszelkie nieprawidłowe dane z aplikacji Zdrowie." + "value" : "Korekty insuliny zostały wyłączone!" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Verificați ora dispozitivului și/sau eliminați orice date incorecte din Apple Health." + "value" : "Ajustările de insulină au fost dezactivate!" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Проверьте время вашего устройства и/или удалите недействительные данные из Apple Health." + "value" : "Регулировка инсулина была отключена!" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Aygıtınızın saatini kontrol edin ve/veya tüm geçersiz verileri Apple Sağlık'tan kaldırın." + "value" : "İnsülin ayarlamaları devre dışı bırakıldı!" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "请检查设备时间,并/或从“苹果健康”App中删除任何无效数据。" + "value" : "胰岛素剂量调整功能已被禁用!" } } } }, - "Check your glucose levels around 20 to 30 min after eating. If you're still low, consider eating the same amount." : { - + "Insulin Automation" : { + "comment" : "Closed loop settings button descriptive text" }, - "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." : { - "comment" : "Carb entry section footer text explaining absorption time", + "Insulin Delivery" : { + "comment" : "The title of the insulin delivery graph", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "توصيل الأنسولين" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Vælg en længere absorptionstid ved større måltider, eller dem med fedt og proteiner. Det er blot hjælp til algoritmen og behøver ikke være nøjagtig." + "value" : "Insulintilførsel" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Wähle eine längere Resorptionsdauer für größere Mahlzeiten oder welche die viel Fett und Proteine beinhalten. Dies ist eine Unterstützung für den Algorithmus und muss nicht genau sein." + "value" : "Insulinabgabe" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Elija un tiempo de absorción más largo para comidas más grandes, o aquellas que contienen grasas y proteínas. Esta es solo una guía para el algoritmo y no necesita ser exacta." + "value" : "Administración de Insulina" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Valitse pidempi imeytymisaika isoille tai paljon rasvaa ja proteiineja sisältäville aterioille. Tämä on suuntaa antava ohje, eikä sen tarvitse olla tarkka." + "value" : "Insuliinin annostelu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Choisissez un temps d’absorption plus long pour les gros repas ou ceux contenant des graisses et des protéines. Ceci est seulement un guide pour l'algorithme et n'a pas besoin d'être exact." + "value" : "Administration de l'insuline" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "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." + "value" : "Insulin Delivery" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Scegli un periodo di assorbimento piu lungo per i pasti piu grandi o quelli contenenti grassi e proteine. Questa e solo una guida all’algoritmo e non e necessario che sia esatta." + "value" : "Erogazione insulina" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "量の多い食事や脂質やたんぱく質を含んだ食事には長い吸収時間を選んでください。これはアルゴリズムのための参考で、厳密である必要はありません。" + "value" : "インスリン放出" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Velg lengre absorpsjonstid for større måltider, eller de som inneholder fett og proteiner. Dette er kun veiledning til algoritmen og trenger ikke være nøyaktig." + "value" : "Insulinlevering" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Kies een langere opnametijd voor grotere maaltijden of voor maaltijden die vetten en eiwitten bevatten. Dit is alleen een leidraad voor het algoritme en hoeft niet exact te zijn." + "value" : "Insulinetoediening" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wybierz dłuższy czas absorpcji dla większych, bogatobiałkowych lub wysokotłuszczowych posiłków. To tylko wskazówka dla algorytmu i nie musi być bardzo dokładna." + "value" : "Podaż insuliny" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Escolha um tempo de absorção mais longo para refeições maiores ou aquelas que contenham gorduras e proteínas. Esta é apenas uma orientação para o algoritmo e não precisa ser exata." - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alegeți o durată mai lungă de absorbție pentru mese mai mari sau pentru cele care conțin grăsimi și proteine. Nu e necesară o valoare exactă, scopul e să oferim doar o ghidare pentru algoritm." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Выберите более длительное время усвоения для больших порций пищи или тех, которые содержат жиры и белки. Это лишь руководство к алгоритму и не обязательно должно быть точным." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Välj en längre absorptionstid för måltid med mycket fett eller protein. Ofta är det bäst att dela upp måltiden i snabba och långsamma kolhydrater och mata in dessa var för sig." - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Daha büyük öğünler veya yağ ve protein içeren besinler için daha uzun bir emilim süresi seçin. Bu değer yalnızca algoritmaya rehberlik eder ve kesin olması gerekmez." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lựa chọn khoảng thời gian tiêu hóa dài hơn cho các bữa ăn no, hoặc những bữa ăn nhiều chất béo và protein. Đây chỉ là hướng dẫn cho thuật toán Algorithm và không cần phải chính xác." - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "对于大餐或含有脂肪和蛋白质的餐食,请选择较长的吸收时间。此设置仅作为算法的参考, 无需精确。" - } - } - } - }, - "Choose Favorite:" : { - "comment" : "The label for the row where you choose saved Favorite Food", - "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vælg favorit:" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wähle Favorit:" + "value" : "Insulina Entregue" } }, - "fr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Choisissez le favori :" + "value" : "Administrare insulină" } }, - "it" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Scegli il preferito:" + "value" : "Подача инсулина" } }, - "nb" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Velg favoritt:" + "value" : "Podávanie inzulínu" } }, - "nl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kies favoriet:" + "value" : "Insulin doserat" } }, - "pl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Wybierz ulubione:" + "value" : "İnsulin İletimi" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Alegeți preferatul:" + "value" : "Khối lượng tiêm insulin" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "选择常用" + "value" : "胰岛素输注" } } } }, - "Choose the glucose value (or values) you want %@ to target when changing how much basal insulin you get." : { + "Insulin Delivery Log" : { }, - "Close" : { - "comment" : "Preset training needed alert cancel button\nThe button label of the action used to dismiss the unsafe notification permission alert", + "Insulin effects" : { + "comment" : "Details for missing data error when insulin effects are missing\nDetails for missing data error when insulin effects including pending insulin are missing", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تأثيرات الأنسولين" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Luk" + "value" : "Insulineffekter" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Schließen" + "value" : "Insulinwirkungen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Cerrar" + "value" : "Efectos de la insulina" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Sulje" + "value" : "Insuliinivaikutus" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Fermer" + "value" : "Effets de l'insuline" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "סגור" + "value" : "Insulin effects" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Chiudi" + "value" : "Effetto dell’insulina" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "インスリン効果" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Lukk" + "value" : "Insulin effekt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Sluiten" + "value" : "Insulineëffecten" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Zamknij" + "value" : "wpływ insuliny" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Efeitos da Insulina" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Închideți" + "value" : "Efecte insulină" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Закрыть" + "value" : "Влияние инсулина" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Stäng" + "value" : "Insulineffekter" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kapat" + "value" : "İnsülin etkileri" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tác dụng của insulin" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "关闭" + "value" : "胰岛素效果" } } } }, - "Close Training" : { + "Insulin Event" : { }, - "Closed Loop" : { - "comment" : "The title text for the looping enabled switch cell", + "Insulin Model" : { + "comment" : "Details for configuration error when insulin model is missing\n The title text for the insulin model setting row", + "extractionState" : "manual", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "حلقة مغلقة" + "value" : "نوع الأنسولين" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Lukket Loop" + "value" : "Insulinmodel" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Closed Loop" + "value" : "Insulin-Modell" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulin Model" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Circuito Cerrado" + "value" : "Modelo de Insulina" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Suljettu säätö" + "value" : "Insuliinimalli" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Boucle Fermée" + "value" : "Modèle d'insuline" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Closed Loop" + "value" : "Insulin Model" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop chiuso" + "value" : "Modello di azione dell'Insulina" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "クローズドループ" + "value" : "インスリンモデル" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Lukket Loop" + "value" : "Insulin Modell" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Actieve loop" + "value" : "Insulinemodel" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pętla Zamknięta" + "value" : "Model insuliny" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Ciclo Fechado" + "value" : "Modelo de Insulina" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Buclă închisă" + "value" : "Model insulină" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Замкнутый цикл" + "value" : "Модель инсулина" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inzulínový model" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Sluten loop" + "value" : "Insulinmodell" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kapalı Döngü" + "value" : "İnsülin Modeli" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Vòng lặp kín" + "value" : "Chủng loại Insulin" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "闭环模式" + "value" : "胰岛素模型" } } } }, - "Closed Loop OFF" : { - "comment" : "Alert title for closed loop off informational modal", + "Insulin Pump" : { + "comment" : "Descriptive text for Insulin Pump", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Lukket loop FRA" + "value" : "Insulinpumpe" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Closed Loop AUS" + "value" : "Insulinpumpe" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Asa cerrada APAGADA" + "value" : "Microinfusadora de insulina" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Suljettu säätö pois päältä" + "value" : "Insuliinipumppu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Boucle Ouverte" + "value" : "Pompe à insuline" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משאבת אינסולין" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop chiuso disattivato" + "value" : "Pompa" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Lukket Loop AV" + "value" : "Insulinpumpe" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Actieve loop UIT" + "value" : "Insulinepomp" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pętla zamknięta WYŁĄCZONA" + "value" : "Pompa insulinowa" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Buclă închisă dezactivată" + "value" : "Pompa de insulină" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Замкнутый цикл ВЫКЛ" + "value" : "Инсулиновая помпа" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Sluten Loop är AV" + "value" : "Insulinpump" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kapalı Döngü KAPALI" + "value" : "İnsülin pompası" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "闭环模式已关闭" + "value" : "胰岛素泵" } } } }, - "Closed Loop requires an active CGM Sensor Session" : { - "comment" : "The description text for the looping enabled switch cell when closed loop is not allowed because the sensor is inactive", + "Insulin Resumed" : { + + }, + "Insulin Sensitivities" : { + "comment" : "The title of the insulin sensitivities schedule screen\n The title text for the insulin sensitivity schedule", + "extractionState" : "manual", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "حساسية الأنسولين" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Lukket Loop kræver en aktiv CGM sensor-session" + "value" : "Insulinfølsomheder" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Closed Loop erfordert eine aktive CGM-Sensorsitzung" + "value" : "Insulinempfindlichkeit" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulin Sensitivities" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "La asa cerrada requiere una sesión de sensor CGM activa" + "value" : "Sensibilidad a la insulina" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Suljettu säätö vaatii aktiivisen glukoosisensorin" + "value" : "Insuliiniherkkyydet" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop en boucle fermée requiert une session de capteur CGM active." + "value" : "Facteurs de sensibilité à l'insuline" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Insulin Sensitivities" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop chiuso richiede almeno una sessione attiva del sensore CGM" + "value" : "Sensibilità insulinica" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "インスリン効果値" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Lukket Loop krever en aktiv CGM sensorøkt" + "value" : "Insulinfølsomhet" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Actieve loop vereist een lopende CGM-sensorsessie" + "value" : "Insulinegevoeligheden" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Zamknięta pętla wymaga aktywnego sensora CGM" + "value" : "Wrażliwość na insulinę (ISF)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sensibilidades a Insulina" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bucla închisă necesită o sesiune activă a unui senzor de glicemie" + "value" : "Factor de sensibilitate la insulină" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Замкнутый цикл требует активного подключенного датчика CGM" + "value" : "Факторы чувствительности инсулина" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Sluten Loop kräver en aktiv CGM-sensor" + "value" : "Insulinkänslighet" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kapalı Döngü, aktif bir CGM Sensör Oturumu gerektirir" + "value" : "İnsülin Duyarlılığı" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Độ nhạy của Insulin" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "闭环需要活动的 CGM 传感器会话" + "value" : "胰岛素敏感系数" } } } }, - "Closed Loop requires Setup to be Complete" : { - "comment" : "The description text for the looping enabled switch cell when onboarding is not complete", + "Insulin Sensitivity Factor (ISF)" : { + + }, + "Insulin Sensitivity Schedule" : { + "comment" : "Details for configuration error when insulin sensitivity schedule is missing", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Lukket Loop kræver, at opsætningen er fuldført" + "value" : "Insulinfølsomhed tidsplan" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Closed Loop erfordert, dass die Einrichtung abgeschlossen ist" + "value" : "Insulinempfindlichkeit Plan" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "El Circuito Cerrado requiere que la configuración esté completa" + "value" : "Horario de la sensibilidad a la insulina" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop en boucle fermée nécessite une configuration complète" + "value" : "Horaire de facteur de sensibilité à l'insuline" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop chiuso richiede che la configurazione sia completata" + "value" : "Programma di sensibilità insulinica" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Lukket Loop krever at installasjonen er fullført" + "value" : "Insulin følsomhet tidsplan" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Actieve loop vereist dat de installatie is voltooid" + "value" : "Insulinegevoeligheidschema" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Zamknięta pętla wymaga zakończenia konfiguracji" + "value" : "Harmonogram wrażliwości na insulinę" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bucla închisă necesită ca setarea să fie finalizată" + "value" : "Orarul Factorului de Sensibilitate la Insulină" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Замкнутый цикл требует завершения настройки" + "value" : "График чувствительности к инсулину" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kapalı Döngü, Kurulumun Tamamlanmasını gerektirir" + "value" : "İnsülin Duyarlılık Programı" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "启用闭环控制前需完成所有设置。" + "value" : "胰岛素敏感系数(ISF)方案" } } } }, - "com.loudnate.InsulinKit.IOBDateLabel" : { - "comment" : "The format string describing the date of an IOB value. The first format argument is the localized date.", - "extractionState" : "extracted_with_value", + "Insulin Suspended" : { + "comment" : "The title of the cell indicating the pump is suspended", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "d %1$@" + "value" : "Insulin suspenderet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "um %1$@" - } - }, - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "at %1$@" + "value" : "Insulinabgabe unterbrochen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "en %1$@" + "value" : "Insulina Suspendida" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "klo %1$@" + "value" : "Insuliini pysäytetty" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "à %1$@" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "ב-%1$@" + "value" : "Insuline suspendue" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "a %1$@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$@ 時点" + "value" : "Insulina sospesa" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "kl. %1$@" + "value" : "Insulintilførsel utsatt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "om %1$@" + "value" : "Insulinetoediening onderbroken" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "o %1$@" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "em %1$@" + "value" : "Podawanie Zawieszone" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "la %1$@" + "value" : "Administrarea insulinei suspendată" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "в %1$@" + "value" : "Подача инсулина приостановлена" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "kl %1$@" + "value" : "Insulintillförsel pausad" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "lúc %1$@" + "value" : "İnsülin Askıya Alındı" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在 %1$@" + "value" : "胰岛素已暂停输注" } } } }, - "com.loudnate.InsulinKit.totalDateLabel" : { - "comment" : "The format string describing the starting date of a total value. The first format argument is the localized date.", - "extractionState" : "extracted_with_value", + "Insulin Type" : { + "comment" : "Insulin type label", "localizations" : { - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "siden %1$@" + "value" : "Typ inzulínu" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "seit %1$@" + "value" : "Insulintype" } }, - "en" : { + "de" : { "stringUnit" : { - "state" : "new", - "value" : "since %1$@" + "state" : "translated", + "value" : "Insulintyp" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "desde %1$@" + "value" : "Tipo de Insulina" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ jälkeen" + "value" : "Insuliinityyppi" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "depuis %1$@" + "value" : "Type d'insuline" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מאז %1$@" + "value" : "סוג האינסולין" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "da %1$@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$@ より" + "value" : "Tipo d'insulina" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "siden %1$@" + "value" : "Insulintype" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "sinds %1$@" + "value" : "Insulinetype" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "od %1$@" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "desde %1$@" + "value" : "Rodzaj insuliny" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "de la %1$@" + "value" : "Tipul de insulină" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "с %1$@" + "value" : "Тип инсулина" } }, - "sv" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "sedan %1$@" + "value" : "Typ inzulínu" } }, - "tr" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ den beri" + "value" : "Insulintyp" } }, - "vi" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "từ lúc %1$@" + "value" : "İnsülin Tipi" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "自从 %1$@" + "value" : "胰岛素类型" } } } }, - "com.loudnate.LoopKit.errorAlertActionTitle" : { - "comment" : "The title of the action used to dismiss an error alert", - "extractionState" : "extracted_with_value", + "Integral Retrospective Correction" : { + "comment" : "Title for integral retrospective correction experiment description\nTitle of integral retrospective correction experiment", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "موافق" - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Integral Retrospective Correction" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "OK" - } - }, - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "OK" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "value" : "Integrale retrospektive Korrektur" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "OK" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "אישור" + "value" : "Correction rétrospective intégrale" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "OK" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "value" : "Correzione retrospettiva integrale (IRC)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Integrert retrospektiv korreksjon" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Integrale retrospectieve correctie" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "OK" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tamam" + "value" : "Integralna korekta retrospektywna" } }, - "vi" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Corecție retrospectivă integrală" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "整体回顾性校正 (IRC)" } } } }, - "Combination of high and low intensity" : { - - }, - "Competition Stress" : { - - }, - "Complete each section below to learn how presets can be used for a variety of situations." : { - - }, - "Complete Setup" : { - "comment" : "Title text for button to complete setup", + "Integral Retrospective Correction (IRC) is an extension of the standard Retrospective Correction (RC) algorithm component in Loop, which adjusts the forecast based on the history of discrepancies between predicted and actual glucose levels.\n\nIn contrast to RC, which looks at discrepancies over the last 30 minutes, with IRC, the history of discrepancies adds up over time. So continued positive discrepancies over time will result in increased dosing. If the discrepancies are negative over time, Loop will reduce dosing further." : { + "comment" : "Description of Integral Retrospective Correction toggle.", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Fuldfør opsætning" + "value" : "Integral Retrospective Correction (IRC) er en udvidelse af standard Retrospective Correction (RC) algoritmekomponent i Loop, som justerer prognosen baseret på historikken med uoverensstemmelser mellem forudsagte og faktiske glukoseniveauer.\n\nI modsætning til RC, der ser på uoverensstemmelser i løbet af de sidste 30 minutter, med IRC, tilføjes historikken over uoverensstemmelser over tid. Så fortsatte positive uoverensstemmelser over tid vil resultere i øget dosering. Hvis uoverensstemmelserne er negative over tid, vil Loop reducere doseringen yderligere." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Einstellungen abschließen" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completa la Configuración" + "value" : "Integral Retrospective Correction (IRC) ist eine Erweiterung der standardmäßigen Retrospective Correction (RC)-Algorithmuskomponente in Loop, die die Prognose basierend auf der Historie der Abweichungen zwischen vorhergesagten und tatsächlichen Glukosewerten anpasst. \n\nIm Gegensatz zu RC, das die Abweichungen der letzten 30 Minuten betrachtet, summiert sich bei IRC der Verlauf der Abweichungen im Laufe der Zeit. Daher führen anhaltende positive Abweichungen im Laufe der Zeit zu einer erhöhten Dosierung. Wenn die Abweichungen im Laufe der Zeit negativ sind, reduziert Loop die Dosierung weiter." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Terminer la configuration" + "value" : "La correction rétrospective intégrale (IRC) est une extension de l'algorithme standard de correction rétrospective (RC) de Loop, qui ajuste les prévisions en fonction de l'historique des écarts entre les taux de glucose prévus et réels.\n\nContrairement à la correction correction rétrospective, qui prend en compte les écarts des 30 dernières minutes, la correction rétrospective intégrale (IRC) prend en compte l'historique des écarts au fil du temps. Ainsi, des écarts positifs continus au fil du temps entraîneront une augmentation du dosage. Si les écarts sont négatifs au fil du temps, Loop réduira encore le dosage." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Completa configurazione" + "value" : "Correzione retrospettiva integrale (IRC) è un'estensione del componente standard dell'algoritmo di correzione retrospettiva (RC) in Loop, che regola la previsione in base alla cronologia delle discrepanze tra i livelli di glicemia previsti e quelli effettivi. \n\nA differenza di RC, che esamina le discrepanze negli ultimi 30 minuti, con IRC la cronologia delle discrepanze si accumula nel tempo. Pertanto, continue discrepanze positive nel tempo comporteranno un aumento del dosaggio. Se le discrepanze diventano negative nel tempo, Loop ridurrà ulteriormente il dosaggio." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Fullfør oppsett" + "value" : "Integral Retrospective Correction (IRC) er en utvidelse av standardalgoritmekomponenten Retrospective Correction (RC) i Loop, som justerer prognosen basert på historikken for avvik mellom forventede og faktiske glukosenivåer.\n\nI motsetning til RC, som ser på avvik i løpet av de siste 30 minuttene, summerer IRC avvikene over tid. Fortsatte positive avvik over tid vil derfor føre til økt dosering. Hvis avvikene er negative over tid, vil Loop redusere doseringen ytterligere." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Volledige installatie" + "value" : "Integrale retrospectieve correctie (IRC) is een uitbreiding van het standaardonderdeel Retrospectieve correctie (RC) van het Loop-algoritme. RC past de voorspelling aan op basis van eerdere verschillen tussen voorspelde en werkelijke glucosewaarden.\n\nRC kijkt alleen naar verschillen in de laatste 30 minuten. Bij IRC tellen de verschillen in de loop van de tijd op. Blijven de verschillen langere tijd positief, dan doseert Loop meer. Zijn ze langere tijd negatief, dan doseert Loop nog minder." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Zakończ konfigurację" + "value" : "Integralna korekta retrospektywna (IRC) jest rozszerzeniem standardowego komponentu algorytmu Korekta retrospektywna (RC) w Loop, który koryguje prognozę na podstawie historii rozbieżności między przewidywanymi a rzeczywistymi poziomami glukozy. \n\n W przeciwieństwie do RC, który analizuje rozbieżności w ciągu ostatnich 30 minut, w przypadku IRC historia rozbieżności sumuje się w czasie. Tak więc utrzymujące się dodatnie rozbieżności w czasie spowodują zwiększenie dawki. Jeśli rozbieżności są ujemne w czasie, Loop jeszcze bardziej zmniejszy podawanie insuliny." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Configurare finalizată" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Завершить настройку" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kurulumu Tamamla" + "value" : "Corecția Retrospectivă Integrală (CRI) este o extensie a componentei algoritmului standard de Corecție Retrospectivă (CR) din Loop, care ajustează prognoza pe baza istoricului discrepanțelor dintre nivelurile de glicemie prezise și cele reale. \n \nSpre deosebire de CR, care analizează discrepanțele din ultimele 30 de minute, cu CRI, istoricul discrepanțelor se adună în timp. Așadar, discrepanțele pozitive continue în timp vor duce la creșterea dozării. Dacă discrepanțele sunt negative în timp, Loop va reduce și mai mult dozarea." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "完成设置" + "value" : "整体回顾性校正(IRC)是Loop中标准回顾性校正(RC)算法组件的扩展,它根据预测血糖值与实际血糖值之间的历史偏差来调整预测值。\n\n与仅关注过去30分钟偏差情况的RC不同,IRC会随时间推移累积偏差历史数据。因此,若偏差值长期呈正值,剂量将相应增加;若偏差值长期呈负值,Loop则会进一步减少剂量。" } } } }, - "Configuration" : { - "comment" : "The title of the Configuration section in settings", - "extractionState" : "stale", + "Interrupted %1$@: %2$@ of %3$@ %4$@" : { + "comment" : "Description of an interrupted bolus dose entry (1: title for dose type, 2: value (? if no value) in bold, 3: programmed value (? if no value), 4: unit)", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "المعطيات" - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfigurace" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Konfiguration" + "value" : "Afbrudt %1$@: %2$@ af %3$@ %4$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Konfiguration" + "value" : "%1$@ unterbrochen: %2$@ von %3$@ %4$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Configuración" + "value" : "%1$@ interrumpido: %2$@ de %3$@ %4$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Määritykset" + "value" : "Keskeytetty %1$@: %2$@ / %3$@ %4$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Configuration" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuration" + "value" : "Interrompu %1$@: %2$@ de %3$@ %4$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Configurazione" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "コンフィグレーション" + "value" : "Interrotto %1$@: %2$@ di %3$@ %4$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Konfigurasjon" + "value" : "Avbrutt %1$@: %2$@ av %3$@ %4$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Configuratie" + "value" : "Onderbroken %1$@: %2$@ van %3$@ %4$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Konfiguracja" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuração" + "value" : "Przerwane %1$@ : %2$@ z %3$@ %4$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Configurare" + "value" : "Întrerupere %1$@: %2$@ din %3$@ %4$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Конфигурация" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konfigurácia" + "value" : "Прервано %1$@: %2$@ из %3$@ %4$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Konfiguration" + "value" : "Avbruten %1$@: %2$@ av %3$@ %4$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Konfigürasyon" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cấu hình" + "value" : "%1$@ kesintiye uğradı: %3$@ %4$@'nın %2$@ 'si" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "配置" + "value" : "中断的 %1$@:计划剂量:%3$@ %4$@, 实际剂量: %2$@" } } } }, - "Configuration Error: %1$@" : { - "comment" : "The error message displayed for configuration errors. (1: configuration error details)", + "Interval Training " : { + + }, + "Invalid absorption time: %1$@ hours" : { + "comment" : "Carb error description: invalid absorption time. (1: Input duration in hours).", "localizations" : { - "ar" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "خطأ في المعطيات: %1$@" + "value" : "Ugyldig absorptionstid: %1$@ timer" } }, - "da" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Konfigurationsfejl: %1$@" + "value" : "Ungültige Resorptionszeit: %1$@ Stunden" } }, - "de" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Konfigurationsfehler: %1$@" + "value" : "Temps d'absorption invalide : %1$@ heures" } }, - "es" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Error de Configuración: %1$@" + "value" : "Periodo di assorbimento non valido: %1$@ ore" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Määritysvirhe: %1$@" + "value" : "Ugyldig absorpsjonstid: %1$@ timer" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Erreur de Configuration: %1$@" + "value" : "Ongeldige opnametijd: %1$@ uur" } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Configuration Error: %1$@" + "value" : "Nieprawidłowy czas absorpcji: %1$@ godz" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Errore di configurazione: %1$@" + "value" : "Timp de absorbție nevalid: %1$@ ore" } }, - "ja" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "設定エラー: %1$@" + "value" : "无效的吸收时间:%1$@ 小时" + } + } + } + }, + "Invalid Bolus Amount" : { + "comment" : "Bolus error description: invalid bolus amount.", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ugyldig bolusmængde" } }, - "nb" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Konfigurasjonsfeil: %1$@" + "value" : "Ungültige Bolusmenge" } }, - "nl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Configuratiefout: %1$@" + "value" : "Quantité de bolus invalide" } }, - "pl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Błąd konfiguracji: %1$@" + "value" : "כמות בולוס לא תקינה" } }, - "pt-BR" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Erro de Configuração: %1$@" + "value" : "Quantità bolo non valida" } }, - "ro" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Eroare configurare: %1$@" + "value" : "Ugyldig bolusmengde" } }, - "ru" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ошибка конфигурации: %1$@" + "value" : "Ongeldige bolushoeveelheid" } }, - "sv" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Konfigurationsfel %1$@" + "value" : "Nieprawidłowa wielkość bolusa" } }, - "tr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Konfigürasyon Hatası: %1$@" + "value" : "Cantitate invalidă de bolus" } }, - "vi" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Lỗi cấu hình: %1$@" + "value" : "Неверный объем болюса" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Geçersiz Bolus Miktarı" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "配置错误:%1$@" + "value" : "大剂量无效" } } } }, - "Configure Display" : { - "comment" : "Title for the view to configure the lock screen display", + "Invalid carb amount" : { + "comment" : "Carb error description: invalid carb amount.", "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ugyldig kulhydratmængde" + } + }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Anzeige konfigurieren" + "value" : "Ungültige Kohlenhydratmenge" } }, - "fr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Configurer l'affichage" + "value" : "Cantidad de carbohidratos no válida" } }, - "nb" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tilpass skjermen" + "value" : "Quantité de glucides invalide" } }, - "nl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Scherm configureren" + "value" : "כמות פחמימות לא תקינה" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Configurați afișajul" + "value" : "Quantità di carboidrati non valida" } }, - "zh-Hans" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "显示设置" + "value" : "Ugyldig karbohydratmengde" } - } - } - }, - "Configure Lock Screen / Carplay Row" : { - "comment" : "A link that takes the user to a view where they can configure the display of the live activity screen on their lock screen and in CarPlay.", - "isCommentAutoGenerated" : true, - "localizations" : { - "de" : { + }, + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Sperrbildschirm / CarPlay-Zeile konfigurieren" + "value" : "Ongeldige hoeveelheid koolhydraten" } }, - "fr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Configurer l'écran de verrouillage / CarPlay" + "value" : "Nieprawidłowa ilość węglowodanów" } }, - "nb" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Tilpass låseskjerm / Carplay rad" + "value" : "Cantitate de carbohidrați invalidă" } }, - "nl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Rij voor toegangsscherm / CarPlay instellen" + "value" : "Неверное количество углеводов" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Configurați ecranul de blocare / rândul CarPlay" + "value" : "Geçersiz karb miktarı" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "配置锁屏 / CarPlay 显示行" + "value" : "碳水含量无效" } } } }, - "Congratulations! You've finished the Presets training." : { - - }, - "Consider an exercise you do regularly and think about how hard you push yourself." : { - - }, - "Consider eating around 10 to 20 grams of fast-acting carbs" : { - - }, - "Continue" : { - "comment" : "Button label for continue\nDefault alert dismissal", + "Invalid data: %1$@" : { + "comment" : "The error message when invalid data was encountered. (1: details of invalid data)", + "extractionState" : "manual", "localizations" : { - "cs" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Pokračovat" + "value" : "بيانات غير صالحة: %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Fortsæt" + "value" : "Fejlagtige data: %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Weiter" + "value" : "Ungültige Daten: %1$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid data: %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Continuar" + "value" : "Datos no válidos: %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Jatka" + "value" : "Virheellinen tieto: %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Continuer" + "value" : "Données Incorrectes: %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Continue" + "value" : "Invalid data: %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Continua" + "value" : "Dati non validi: %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "次へ" + "value" : "無効データ: %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Fortsett" + "value" : "Ugyldige data: %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ga verder" + "value" : "Ongeldige gegevens: %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Kontynuuj" + "value" : "Błędne dane: %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Continuar" + "value" : "Dados inválidos: %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Continuați" + "value" : "Date invalide: %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Продолжить" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pokračovať" + "value" : "Неверные данные: %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Fortsätt" + "value" : "Ogiltigt värde: %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Devam et" + "value" : "Geçersiz veri: %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Tiếp tục" + "value" : "Dữ liệu vô hiệu: %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "继续" + "value" : "无效数据: %1$@" } } } }, - "Continue to %@" : { - - }, - "Continuous Glucose Monitor" : { - "comment" : "Descriptive text for Continuous Glucose Monitor", + "Invalid Future Glucose" : { + "comment" : "Title for bolus screen notice when glucose data is in the future", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "نظام متابعة السكر المستمرة" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kontinuerlig Blodsukker Måler (CGM)" + "value" : "Ugyldig fremtidig glukose" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kontinuierliche Blutzuckermessung" + "value" : "Ungültige zukünftige Blutzuckerwerte" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Monitor de glucosa continuo" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Glukoosinseuranta (CGM)" + "value" : "Glucosa futura no válida" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Lecteur de glycémie en continu" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuous Glucose Monitor" + "value" : "Glycémie future invalide" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Monitoraggio continuo glicemia" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "CGM" + "value" : "Glicemia futura non valida" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Kontinuerlig glukosemonitor" + "value" : "Ugyldig fremtidig blodsukker" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Continue glucose monitor" + "value" : "Ongeldige toekomstige glucose" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Ciągły Monitoring Glukozy" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Monitoramento Contínuo de Glicose" + "value" : "Przyszła glukoza nie jest znana" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Senzor de monitorizare continuă a glicemiei" + "value" : "Glicemie Viitoare Invalidă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Непрерывный мониторинг гликемии" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontinuerlig glukosmätning" + "value" : "Недействительная будущая глюкоза" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Sürekli Glikoz İzleme" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kiểm soát đường huyết liên tục" + "value" : "Geçersiz Gelecek Glikoz" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "连续血糖监测仪" + "value" : "无效的未来血糖值" } } } }, - "Continuous or exercise without breaks" : { - - }, - "Correction Range" : { - "comment" : "The title of the glucose target range schedule screen\n The title text for the glucose target range schedule", - "extractionState" : "manual", + "Invalid glucose reading with a timestamp that is %1$@ in the future" : { + "comment" : "The error message when glucose data is in the future. (1: glucose data time in future in minutes)", "localizations" : { - "ar" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "نطاق التصحيح" + "value" : "Ugyldig glukoseaflæsning med et tidsstempel, der er %1$@ i fremtiden" } }, - "da" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Korrektionsområde" + "value" : "Ungültiger Blutzuckermesswert mit einem Zeitstempel, der %1$@ in der Zukunft liegt" } }, - "de" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Korrekturbereich" + "value" : "Lectura de glucosa no válida de %1$@ en el futuro" } }, - "en" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Correction Range" + "value" : "Lecture de glucose non valide avec un horodatage situé à %1$@ dans le futur" } }, - "es" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Rango de Corrección" + "value" : "Lettura della glicemia non valida con data e ora %1$@ nel futuro" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Korjausalue" + "value" : "Ugyldig blodsukkermåling med et tidsstempel som er %1$@ i fremtiden" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Plage de correction" + "value" : "Ongeldige glucosemeting met een tijdstempel dat %1$@ in de toekomst ligt." } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "טווח תיקון" + "value" : "Nieprawidłowy odczyt glukozy ze znacznikiem czasu, który wynosi %1$@ w przyszłości" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Intervallo di correzione" + "value" : "Citirea invalidă a glicemiei cu un marcaj temporal care este %1$@ în viitor" } }, - "ja" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "ターゲット範囲" + "value" : "Неверное показание глюкозы с временной меткой, которая находится на %1$@ в будущем" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Korreksjonsområde" + "value" : "Gelecekte %1$@ olan bir zaman damgasıyla geçersiz KŞ okuması" } }, - "nl" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Correctiebereik" + "value" : "血糖读数无效,其时间戳为 %1$@ ,该时间点在未来" + } + } + } + }, + "iOS" : { + + }, + "iOS Critical Alerts and Time Sensitive Alerts are types of Apple notifications. They are used for high-priority events. Some examples include:" : { + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kritiske iOS-advarsler og tidsfølsomme advarsler er typer Apple-meddelelser. De bruges til begivenheder med høj prioritet. Nogle eksempler inkluderer:" } }, - "pl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Zakres docelowy" + "value" : "Kritische iOS-Warnungen und zeitkritische Warnungen sind Arten von Apple-Benachrichtigungen. Sie werden für Ereignisse mit hoher Priorität verwendet. Einige Beispiele:" } }, - "pt-BR" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Faixa de Correção" + "value" : "Les alertes critiques iOS et les alertes urgentes sont des types de notifications Apple. Elles sont utilisées pour des événements de haute priorité. Voici quelques exemples :" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "gli avvisi critici e gli avvisi sensibili al tempo di iOS sono tipi di notifiche Apple. Vengono utilizzati per eventi ad alta priorità. Alcuni esempi sono:" } }, - "ro" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Interval de corecție" + "value" : "iOS Critical Alerts og Time Sensitive Alerts er typer Apple-varsler. De brukes ved hendelser med høy prioritet. Noen eksempler er:" } }, - "ru" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Диапазон коррекции" + "value" : "Kritieke meldingen en Tijdgevoelige meldingen zijn soorten meldingen van Apple in iOS. Ze worden gebruikt voor belangrijke gebeurtenissen. Enkele voorbeelden:" } }, - "sv" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Målvärde" + "value" : "Alerty krytyczne systemu iOS i alerty zależne od czasu to typy powiadomień Apple. Wykorzystuje się je do zdarzeń o wysokim priorytecie. Oto kilka przykładów:" } }, - "tr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Düzeltme Aralığı" + "value" : "Alertele critice iOS și alertele urgente sunt tipuri de notificări Apple. Sunt folosite pentru evenimente cu prioritate ridicată. Câteva exemple includ:" } }, - "vi" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Phạm vi liều Bổ sung" + "value" : "Критические оповещения iOS и срочные оповещения — это типы уведомлений Apple. Они используются для проведения высокоприоритетных мероприятий. Вот некоторые примеры:" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "校正范围" + "value" : "iOS 严重告警与时效性告警是苹果系统的两类通知,用于高优先级事件。部分示例包括:" } } } }, - "Correction range is a " : { - - }, - "Correction range is a **safety setting**. Changing it can help lower your risk of going low if you expect unusual changes." : { - + "iOS Focus Modes" : { + "comment" : "View title for iOS focus modes\niOS focus modes navigation link label" }, - "Could Not Restart %1$@" : { - "comment" : "Format string for title of reset loop alert. (1: App name)", + "IOS FOCUS MODES" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kunne ikke genstarte %1$@" + "value" : "iOS-FOKUSTILSTANDE" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ konnte nicht neu gestartet werden" + "value" : "IOS-FOKUSMODI" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Impossible de redémarrer %1$@" + "value" : "MODES DE CONCENTRATION IOS" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Impossibile riavviare %1$@" + "value" : "MODALITÀ FOCUS IOS" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Kunne ikke starte %1$@ på nytt" + "value" : "IOS-FOKUSMODUSER" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Kan %1$@ niet herstarten" + "value" : "FOCUSMODI VAN IOS" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nie można ponownie uruchomić %1$@" + "value" : "TRYBY SKUPIENIA IOS" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nu s-a putut reporni %1$@" + "value" : "MODURI CONCENTRARE IOS" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "РЕЖИМЫ ФОКУСИРОВКИ IOS" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无法重启 %1$@" + "value" : "iOS专注模式" } } } }, - "Create new presets" : { + "iOS Focus Modes enable you to have more control over when apps can send you notifications. If you decide to use these, ensure that notifications are allowed and NOT silenced from %1$@." : { + "comment" : "Description text for focus modes (1: app name)" + }, + "iOS has added features such as ‘Focus Mode’ that enable you to have more control over when apps can send you notifications.\n\nIf you wish to continue receiving important notifications from %1$@ while in a Focus Mode, you must ensure that notifications are allowed and NOT silenced from %1$@ for each Focus Mode." : { + "comment" : "Description text for iOS Focus Modes (1: app name) (2: app name)" + }, + "iOS Permissions" : { + "comment" : "Notification & Critical Alert Permissions screen title\niOS Permissions button text" + }, + "iOS Permissions and Mute All App Sounds" : { + "comment" : "Alert Permissions descriptive text" + }, + "ISF" : { }, - "Critical Alerts" : { - "comment" : "Critical Alerts Status text", + "Issue Report" : { + "comment" : "The title text for the issue report menu item\nThe view controller title for the issue report screen", + "extractionState" : "stale", "localizations" : { - "cs" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Kritická upozornění" + "value" : "تقرير المشكلة" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kritiske advarsler" + "value" : "Fejlrapport" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kritische Warnungen" + "value" : "Problembericht" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Alertas críticas" + "value" : "Informe de Errores" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ongelmaraportti" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Alertes critiques" + "value" : "Créer un rapport" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Issue Report" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Avvisi critici" + "value" : "Report problemi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "問題を報告" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Kritiske varsler" + "value" : "Problem Rapport" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Kritieke meldingen" + "value" : "Probleemrapportage" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Alerty krytyczne" + "value" : "Zgłaszanie błędów" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gerar Relatório" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Alerte critice" + "value" : "Generați raport" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Критические оповещения" + "value" : "Сообщить об ошибке" } }, - "sk" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kritické výstrahy" + "value" : "Skapa felrapport" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kritik Uyarılar" + "value" : "Sorun Raporu" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xuất bản Báo cáo" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "关键通知" + "value" : "问题报告" } } } }, - "Critical Alerts and Time Sensitive Notifications are important types of iOS notifications used for events that require immediate attention. Examples include:" : { - - }, - "Critical Alerts and Time Sensitive Notifications are turned OFF" : { - "comment" : "Both Critical Alerts and Time Sensitive Notifications disabled banner title" - }, - "Critical Alerts and Time Sensitive Notifications are turned OFF. Go to the App to fix the issue now." : { - "comment" : "Both Critical Alerts and Time Sensitive Notifications disabled notification body" - }, - "Critical Alerts and Time Sensitive Notifications are turned off. You may not get sound, visual or vibration alerts regarding critical safety information.\n\nTo fix the issue, tap ‘Settings’ and make sure Critical Alerts and Time Sensitive Notifications are turned ON." : { - "comment" : "Both Critical Alerts and Time Sensitive Notifications disabled alert body" - }, - "Critical Alerts and Time Sensitive Notifications are turned off. You may not get sound, visual or vibration alerts regarding critical safety information.\n\nTo fix the issue, tap ‘Settings’ and make sure Notifications and Critical Alerts are turned ON." : { - "comment" : "Both Notifications and Critical Alerts disabled alert body" - }, - "Critical Alerts are turned OFF" : { - "comment" : "Critical alerts disabled banner title" - }, - "Critical Alerts are turned OFF. Go to the App to fix the issue now." : { - "comment" : "Critical alerts disabled notification body" - }, - "Critical Alerts are turned off. You may not get sound, visual or vibration alerts regarding critical safety information.\n\nTo fix the issue, tap ‘Settings’ and make sure Critical Alerts are turned ON." : { - "comment" : "Critical alerts disabled alert body" - }, - "Critical Alerts require a special permission from Apple that many do-it-yourself versions of %1$@ don't include. Without it, iOS treats even urgent alarms as ordinary notifications, so the Ring/Silent switch, Do Not Disturb, and Focus modes can silence them." : { - "comment" : "Description text explaining the critical alerts entitlement may be unavailable (1: app name)" - }, - "Critical Alerts will still sound, but all others will be silenced." : { - "comment" : "Additional description text for temporarily silencing non-critical alerts" - }, - "Critical Event Log Ready" : { - "comment" : "Critical event log ready text", + "It looks like you may not have logged a meal you ate. Tap to log it now." : { + "comment" : "The notification description for a meal that was possibly not logged in Loop.", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kritisk begivenhedslog klar" + "value" : "Det ser ud til, at du måske ikke har indtastet et måltid, du har spist. Tryk for at logge det nu." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kritisches Ereignisprotokoll bereit" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registro de eventos críticos listo" + "value" : "Es sieht so aus, als ob du vergessen hast eine Mahlzeit einzugeben. Tippe um sie nun einzutragen." } }, - "fi" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tärkeiden tapahtumien loki valmis" + "value" : "Il semble que vous n'ayez pas enregistré un repas que vous avez pris. Appuyez pour l'enregistrer maintenant." } }, - "fr" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Journal des événements critiques prêt" + "value" : "ייתכן ולא הזנת ארוחה שאכלת. לחץ כדי להזין אותה כעת." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Registro eventi critici pronto" + "value" : "Sembra che non sia stato registrato un pasto consumato. Tocca per registrarlo ora." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Kritisk hendelseslogg er klar" + "value" : "Det ser ut til at du kanskje ikke har logget et måltid du har spist. Trykk for å logge den nå." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Kritieke gebeurtenislogboek klaar" + "value" : "Het lijkt erop dat je een maaltijd die je hebt gegeten niet hebt toegevoegd. Tik om het nu toe te voegen." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dziennik zdarzeń krytycznych gotowy" + "value" : "Wygląda na to, że nie wprowadziłeś zjedzonego posiłku. Stuknij, aby dodać zaległy posiłek." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Jurnal evenimente critice pregătit" + "value" : "Se pare că nu ați înregistrat o masă pe care ați mâncat-o. Atingeți pentru a o înregistra acum." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Логи критических событий готовы" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kritisk händelselogg klar" + "value" : "Похоже, что Вы не ввели съеденную Вами еду. Нажмите , чтобы записать ее сейчас." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kritik Olay Günlüğü Hazır" + "value" : "Görünüşe göre yediğiniz bir yemeği kaydetmemiş olabilirsiniz. Şimdi kaydetmek için dokunun." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "关键事件日志已就绪" + "value" : "检测到你可能进食了但没有记录餐食。点击此处立即录入碳水。" } } } }, - "Critical Event Logs" : { - "comment" : "Critical event log export title", + "Jogging" : { + + }, + "Keep All Notifications ON for %1$@" : { + "comment" : "Time sensitive notifications callout title (1: app name)" + }, + "Keep your volume up" : { + "comment" : "Critical alert audio fallback callout title" + }, + "Large Meal Entered" : { + "comment" : "Title of the warning shown when a large meal was entered", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kritisk begivenhedslog" + "value" : "Stort måltid indtastet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kritische Ereignisprotokolle" + "value" : "Große Mahlzeit eingegeben" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Registros de eventos críticos" + "value" : "Comida grande ingresada" } }, - "fi" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tärkeiden tapahtumien loki" + "value" : "Grand repas entré" } }, - "fr" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Journaux des événements critiques" + "value" : "ארוחה גדולה נרשמה" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Registri eventi critici" + "value" : "Pasto abbondante inserito" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Kritiske hendelseslogger" + "value" : "Angitt Stort Måltid" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Kritieke gebeurtenislogboek" + "value" : "Grote maaltijd ingevoerd" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dzienniki zdarzeń krytycznych" + "value" : "Wprowadzono duży posiłek" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Jurnal de evenimente critice" + "value" : "O cantitate mare de carbohidrați a fost introdusă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Логи критических событий" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kritiska händelseloggar" + "value" : "Введена большая порция еды" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kritik Olay Günlükleri" + "value" : "Büyük Yemek Girildi" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "关键事件日志" + "value" : "已输入大份餐" } } } }, - "Critical Event Logs were not able to be exported." : { - "comment" : "Critical event log export error alert message", + "Larger glucose drop" : { + + }, + "LAST 7 DAYS" : { + "comment" : "Preset Performance History, Last 7 days, Section title" + }, + "LAST 24 HOURS" : { + "comment" : "Preset Performance History, Last 24 hrs, Section title" + }, + "Last Auto Bolus" : { + + }, + "Last Bolus: " : { + + }, + "Last loop completed" : { + + }, + "Last Used" : { + "comment" : "Preset sorting option description for sorting by last used" + }, + "Later that day, Paloma eats a meal with about 30g of carbs." : { + + }, + "Launches CGM app" : { + "comment" : "Glucose HUD accessibility hint", + "extractionState" : "manual", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قم بتشغيل تطبيق نظام متابعة سكر الدم المستمرة" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kritisk begivenhedslogs kunne ikke eksporteres." + "value" : "Åbner CGM app’en" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kritische Ereignisprotokolle konnten nicht exportiert werden." + "value" : "Öffnet die CGM-App" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Launches CGM app" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "No se han podido exportar los registros de eventos críticos." + "value" : "Lanza app MCG" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Tärkeiden tapahtumien lokia ei voitu viedä." + "value" : "Avaa CGM-sovelluksen" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Les journaux d'événements critiques n'ont pas pu être exportés." + "value" : "Lance l'application CGM" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מפעיל אפליקציית חיישן" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Non è stato possibile esportare i registri degli eventi critici." + "value" : "Avvia l'app CGM" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGMアプリを起動" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Kritiske hendelseslogger kunne ikke eksporteres." + "value" : "Laster inn CGM-appen" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Kritieke gebeurtenislogboeken konden niet worden geëxporteerd." + "value" : "Lanceert CGM app" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nie można wyeksportować dzienników zdarzeń krytycznych." + "value" : "Uruchamia aplikację CGM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inicia app CGM" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Jurnalele de evenimente critice nu au putut fi exportate." + "value" : "Lansează aplicația senzorului de glicemie" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Не удалось экспортировать журналы критических событий." + "value" : "Запускает приложение непрерывного мониторинга CGM" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kritiska händelseloggar kunde inte exporteras." + "value" : "Startar CGM-app" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kritik Olay Günlükleri dışa aktarılamadı." + "value" : "CGM uygulamasına erişim" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Phát hành ứng dụng CGM" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无法导出关键事件日志。" + "value" : "启动CGM软件" } } } }, - "CrossFit" : { - - }, - "Current Basal Rate" : { - - }, - "Current Delivery" : { - - }, - "Current Glucose" : { - "comment" : "Label for glucose entry row on simple bolus screen", + "Learn More" : { + "comment" : "Learn more section header\nOK button title for alert shown when delivery status is uncertain", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Nuværende blodsukker" + "value" : "Lær mere" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Aktueller Blutzucker" + "value" : "Mehr erfahren" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa actual" + "value" : "Más información" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Nykyinen glukoosi" + "value" : "Lue lisää" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glycémie actuelle" + "value" : "En savoir plus" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "מידע נוסף" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia attuale" + "value" : "Ulteriori informazioni" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Nåværende blodsukker" + "value" : "Lære mer" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Huidige glucose" + "value" : "Meer informatie" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Aktualna glukoza" + "value" : "Dowiedz się więcej" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia curentă" + "value" : "Aflați mai multe" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Текущая глюкоза" + "value" : "Подробнее" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Nuvarande blodglukosvärde" + "value" : "Lär dig mer" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Mevcut KŞ" + "value" : "Daha fazla bilgi edin" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "当前血糖" + "value" : "了解更多" } } } }, - "Current glucose of %1$@ is below correction range." : { - "comment" : "Message when offering bolus recommendation even though bg is below range. (1: glucose value)", + "Learn more about Alerts" : { + "comment" : "Link to learn more about alerts" + }, + "Learning Hub" : { + + }, + "Less than a minute remaining" : { + "comment" : "Estimated remaining duration with less than a minute", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "قراءة سكر الدم %1$@ أقل من نطاق التصحيح." - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Den aktuelle glukose for %1$@ er under korrektionsområdet." + "value" : "Mindre end 1 minut tilbage" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Der aktuelle Blutzucker von %1$@ liegt unter dem Korrekturbereich." + "value" : "Weniger als eine Minute verbleiben" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa actual de %1$@ está por debajo del rango de corrección." + "value" : "Queda menos de un minuto" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Nykyinen glukoosi %1$@ on korjausalueen alapuolella." + "value" : "Alle minuutti jäljellä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glycémie actuelle de %1$@ est en dessous de la plage de correction." + "value" : "Moins d'une minute restante" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Current glucose of %1$@ is below correction range." + "value" : "נותרה פחות מדקה" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "La glicemia attuale di %1$@ è al di sotto dell'intervallo glicemico." + "value" : "Meno di un minuto rimanente" } }, - "ja" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "現在の血糖値は %1$@ で補正範囲を下回っています。" + "value" : "Mindre enn et minutt gjenstår" } }, - "nb" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Gjeldende blodsukker på %1$@ er under korreksjonsområdet." + "value" : "Minder dan een minuut resterend" } }, - "nl" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Huidige glucose %1$@ is lager dan het correctiebereik." + "value" : "Pozostało mniej niż minutę" } }, - "pl" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Poziom glukozy %1$@ jest poniżej wartości korekcji." + "value" : "A rămas mai puțin de un minut" } }, - "pt-BR" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : " Glicemia atual %1$@ está abaixo da zona de correção." + "value" : "Осталось меньше минуты" } }, - "ro" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia actuală de %1$@ se situează sub intervalul de corecție." + "value" : "Mindre än en minut återstår" } }, - "ru" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Гликемия %1$@ ниже диапазона коррекции" + "value" : "Bir dakikadan az kaldı" } }, - "sk" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Aktuálna glykémie %1$@ je pod cieľovým rozsahom." + "value" : "剩余时间不足 1 分钟" + } + } + } + }, + "Let’s walk through a simple example to show how a preset might be used in this situation." : { + + }, + "Let’s walk through some examples to show how presets might be used in these situations." : { + + }, + "Light Intensity (Aerobic)" : { + + }, + "Light-to-moderate intensity exercise can cause a drop in glucose levels. This is because your body uses glucose (or sugar) for energy during physical activity." : { + + }, + "Live activity" : { + "comment" : "Live activity screen title", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Live-Aktivität" } }, - "sv" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Nuvarande glukosvärde %1$@ är under målvärde." + "value" : "Activité en direct" } }, - "tr" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ Mevcut KŞ düzeltme aralığının altında." + "value" : "Live activity" } }, - "vi" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : " Chỉ số glucose hiện tại %1$@ nằm dưới Phạm vi Điều chỉnh." + "value" : "Live activiteit" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activitate live" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "当前血糖%1$@低于校正范围" + "value" : "实时活动" } } } }, - "Custom Override" : { - "comment" : "The title of the cell indicating a generic temporary override is enabled", - "extractionState" : "manual", + "Live Activity" : { + "comment" : "Live Activity settings button text" + }, + "Loading..." : { + "comment" : "The loading message for the diagnostic report screen", + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تجاوز مخصص" + "value" : "تحميل..." } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Brugerdefineret Override" + "value" : "Indlæser..." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Benutzerdefinierter Override" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Custom Override" + "value" : "Laden…" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Sobreescritura personalizada" + "value" : "Cargando..." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Mukautettu tilapäisasetus" + "value" : "Ladataan..." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajustement personnalisé" + "value" : "Chargement..." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Custom Override" + "value" : "Loading..." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Override personalizzato" + "value" : "Caricamento in corso..." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "カスタムオーバーライド" + "value" : "ロード中..." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Tilpasset overstyring" + "value" : "Laster inn..." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Aangepaste Override" + "value" : "Laden..." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Custom Override" + "value" : "Ładowanie..." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Sobreposição Personalizada" + "value" : "Carregando..." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Suprascriere personalizată" + "value" : "Se încarcă..." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Настраиваемое ручное управление" + "value" : "Загрузка..." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Anpassad Override" + "value" : "Laddar..." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Özel Geçersiz kılma" + "value" : "Yükleniyor..." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Thói quen Chồng liều" + "value" : "Đang tải..." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "自定义覆盖" + "value" : "读取中..." } } } }, - "Custom preset" : { - "comment" : "The title of the cell indicating a generic custom preset is enabled", + "Lock Screen / Dynamic Island / CarPlay" : { + "comment" : "The title of a section in the live activity settings view, related to lock screen, dynamic island, or carplay.", + "isCommentAutoGenerated" : true, "localizations" : { "de" : { "stringUnit" : { "state" : "translated", - "value" : "Benutzerdefinierte Voreinstellung" + "value" : "Sperrbildschirm / Dynamic Island / CarPlay" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Préréglage personnalisé" + "value" : "Écran verrouillé / Dynamic Island / CarPlay" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Engendefinert forhåndsinnstilling" + "value" : "Låseskjerm / Dynamic Island / CarPlay" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Aangepast programma" + "value" : "Toegangsscherm / Dynamic Island / CarPlay" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Presetare personalizată" + "value" : "Ecran de blocare / Insulă dinamică / CarPlay" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "自定义预设" + "value" : "锁屏 / 灵动岛 / CarPlay 车载" } } } }, - "Custom Preset" : { - "comment" : "The title of the cell indicating a generic custom preset is enabled", - "extractionState" : "stale", + "Lock Screen, Dynamic Island, and CarPlay display" : { + "comment" : "Live Activity settings descriptive text" + }, + "Log Dose" : { + "comment" : "Accessibility label for the manual dose entry button on the insulin delivery screen\nButton text to log a dose\nTitle for dose logging screen", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Brugerdefineret forudindstilling" + "value" : "Log dosis" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Voreinstellung" + "value" : "Dosis speichern" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ajuste Preestablecido personalizado" + "value" : "Registrar dosis" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Mukautettu esiasetus" + "value" : "Kirjaa annos" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Préréglage personnalisé" + "value" : "Enregistrer la dose" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Programmazione" + "value" : "Registra dose" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Egendefinert forhåndsinnstilling" + "value" : "Logg Dose" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Aangepast programma" + "value" : "Registreer dosis" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Cel Tymczasowy" + "value" : "Zarejestruj dawkę" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Presetare personalizată" + "value" : "Înregistrați doza" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Пользовательский пресет" + "value" : "Доза из лога" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Anpassad förinställning" + "value" : "Logga Dos" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Özel Ön Ayar" + "value" : "Günlük Doz" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "自定义预设" + "value" : "记录注射量" } } } }, - "Daily glucose pattern" : { - "comment" : "Accessibility label for the daily glucose pattern (AGP) chart" - }, - "Daily Glucose Pattern" : { - "comment" : "Daily glucose pattern (AGP) section header" - }, - "Date" : { - "comment" : "Date picker label", + "Logged Insulin Dose" : { + "comment" : "The title of the screen displaying a manually entered insulin dose", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "التاريخ" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Dato" + "value" : "Logget insulindosis" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Datum" + "value" : "Gespeicherte Insulindosis" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Fecha" + "value" : "Dosis de insulina registrada" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Aika" + "value" : "Kirjattu insuliiniannos" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Date" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "תאריך" + "value" : "Dose d'insuline enregistrée" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Data" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "日付" + "value" : "Dose d'insulina registrata" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Dato" + "value" : "Logget insulindose" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Datum" + "value" : "Geregistreerde insulinedosis" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Data" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Data" + "value" : "Zarejestrowana dawka insuliny" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Data" + "value" : "Doza de insulină înregistrată" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Дата" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dátum" + "value" : "Зарегистрированная доза инсулина" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Tid" + "value" : "Loggad insulindos" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tarih" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ngày" + "value" : "Kayıtlı İnsülin Dozu" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "日期" + "value" : "记录的胰岛素剂量" } } } }, - "Date Created" : { - "comment" : "Preset sorting option description for sorting by date created" - }, - "Days" : { - "comment" : "A label displayed alongside the days of the week for a glucose alert profile.", - "isCommentAutoGenerated" : true - }, - "dB" : { - "comment" : "The short unit display string for decibles", + "Loggly" : { + "comment" : "The title of the loggly service", + "extractionState" : "manual", "localizations" : { - "ar" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, - "da" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, - "de" : { + "en" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "дБ" + "value" : "Loggly" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "dB" + "value" : "Loggly" } } } }, - "decrease" : { - - }, - "Decreased Delivery" : { - - }, - "Delay 1st Alert" : { - - }, - "Delay for" : { - - }, - "Delay the first alert until your reading stays out of range for this long." : { - - }, - "Delete" : { + "Loop Crashed" : { + "comment" : "Title for crash recovery alert", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "حذف" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Slet" + "value" : "Loop er crashet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Löschen" + "value" : "Loop ist abgestürzt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Eliminar" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Poista" + "value" : "Falla del Loop" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer" + "value" : "Panne de Loop" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מחק" + "value" : "Loop קרס" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Elimina" + "value" : "Loop è crashato" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Slett" + "value" : "Loop krasjet" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Verwijderen" + "value" : "Loop is vastgelopen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Usunąć" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apagar" + "value" : "Pętla uległa awarii" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ștergeți" + "value" : "Loop s-a închis" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Удалить" + "value" : "Произошел сбой приложения" } }, - "sk" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Odstrániť" + "value" : "Loop Çöktü" } }, - "sv" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Ta bort" + "value" : "loop 崩溃了" } - }, - "tr" : { + } + } + }, + "Loop Failure" : { + "comment" : "The notification title for a loop failure", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Sil" + "value" : "فشل في الحلقة المغلقة" } }, - "vi" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Xóa" + "value" : "Loop-fejl" } }, - "zh-Hans" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "删除" + "value" : "Loop fehlgeschlagen" } - } - } - }, - "Delete \"%@\"?" : { - "comment" : "A confirmation dialog that appears when the user taps the \"Delete Alert Profile\" button. The text inside the dialog is parameterized with the name of the profile. The argument is the string “”.", - "isCommentAutoGenerated" : true - }, - "Delete “%@”?" : { - "localizations" : { - "da" : { + }, + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Slet \"%@\"?" + "value" : "Falla del Loop" } }, - "de" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "„ %@ “ löschen?" + "value" : "Loopin häiriö" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer \"%@\"?" + "value" : "Echec de Loop" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "למחוק את \" %@ \"?" + "value" : "Loop Failure" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Eliminare \"%@\" ?" + "value" : "Malfunzionamento di Loop" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ループの不良" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Slette \"%@\"?" + "value" : "Loop-feil" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "„%@” verwijderen?" + "value" : "Loopstoring" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Usunąć „ %@ ”?" + "value" : "Awaria pętli" } }, - "ro" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Ștergeți \"%@\"?" + "value" : "Falha no Loop" } }, - "zh-Hans" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "删除”%@”?" + "value" : "Eșec buclă" } - } - } - }, - "Delete Account" : { - "comment" : "The title of the button to remove the credentials for a service", - "extractionState" : "manual", - "localizations" : { - "cs" : { + }, + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Smazat účet" + "value" : "Ошибка в работе петли" } }, - "da" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Slet konto" + "value" : "Loopfel" } }, - "de" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Konto löschen" + "value" : "Döngü Hatası" } }, - "es" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Eliminar Cuenta" + "value" : "Loop lỗi" } }, - "fi" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Poista tili" + "value" : "Loop失败" } - }, - "fr" : { + } + } + }, + "Loop has detected an issue with your Bluetooth settings, and will not work successfully until Bluetooth is enabled. You will not receive glucose readings, or be able to bolus." : { + "comment" : "Bluetooth unavailable alert body.", + "localizations" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer le compte" + "value" : "Loop har opdaget et problem med dine Bluetooth-indstillinger, og fungerer ikke korrekt, før Bluetooth er aktiveret. Du vil ikke få blodsukkeraflæsninger eller være i stand til at give bolus." } }, - "he" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "מחק חשבון" + "value" : "Loop hat ein Problem mit Deinen Bluetooth-Einstellungen festgestellt und funktioniert nicht, bis Bluetooth aktiviert ist. Du erhältst keine Blutzucker-Werte und es kann kein Bolus abgeben werden." } }, - "it" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Elimina account" + "value" : "Loop ha detectado un problema con la configuración de Bluetooth, y no funcionará correctamente hasta que el Bluetooth esté activado. No recibirás lecturas de glucosa, ni podrás dar los bolos." } }, - "ja" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "アカウントを削除" + "value" : "Loop on havainnut Bluetooth-asetuksissa ongelman, eikä se toimi oikein ennen kuin Bluetooth on otettu käyttöön. Et saa glukoosilukemia, etkä voi antaa bolusta." } }, - "nb" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Slett Konto" + "value" : "Loop a détecté un problème avec vos paramètres Bluetooth, et ne fonctionnera pas correctement tant que le Bluetooth ne sera pas activé. Vous ne pourrez pas recevoir de lectures de glucose, ni être en mesure de faire un bolus." } }, - "nl" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Verwijder account" + "value" : "Loop ha rilevato un problema con le tue impostazioni Bluetooth e non funzionerà correttamente finché il Bluetooth non sarà attivato. Non riceverai letture glicemiche né potrai eseguire il bolo." } }, - "pl" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Usuń konto" + "value" : "Loop har oppdaget et problem med Bluetooth-innstillingene dine, og vil ikke fungere før Bluetooth er aktivert. Du vil ikke motta blodsukkermålinger, eller være i stand til å gi bolus." } }, - "pt-BR" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Remover Conta" + "value" : "Loop heeft een probleem met je Bluetooth-instellingen gedetecteerd en zal niet goed werken totdat Bluetooth wordt ingeschakeld. Je ontvangt geen glucosemetingen en je kunt niet bolussen." } }, - "ro" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Ștergeți cont" + "value" : "Loop wykrył problem z ustawieniami Bluetooth i nie będzie działać poprawnie, dopóki Bluetooth nie zostanie włączony. Nie będziesz otrzymywać odczytów poziomu glukozy ani możliwości podania bolusa." } }, - "ru" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Удалить аккаунт" + "value" : "Loop a detectat o problemă cu setările Bluetooth și nu va funcționa cu succes până când Bluetooth nu este activat. Nu veți primi valori ale glicemiei sau nu veți putea face bolus." } }, - "sk" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Odstrániť účet" + "value" : "Loop обнаружил проблему в настройках Bluetooth и не будет успешно работать, пока Bluetooth не будет включен. Вы не будете получать показания глюкозы и не сможете вводить болюс." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Radera konto" + "value" : "Loop har upptäckt ett problem med dina Bluetooth-inställningar och kommer inte att fungera förrän Bluetooth är aktiverat. Du kommer varken att kunna se dina blodsockervärden eller att kunna ge någon bolus." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Hesabı sil" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Xóa Tài khoản" + "value" : "Loop, Bluetooth ayarlarınızla ilgili bir sorun algıladı ve Bluetooth etkinleştirilene kadar başarılı bir şekilde çalışmayacaktır. KŞ okumaları almayacaksınız veya bolus yapamayacaksınız." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "删除账户" + "value" : "Loop 检测到您的蓝牙设置存在问题,在蓝牙启用之前将无法正常工作。\n您将无法接收血糖读数,也无法推注大剂量。" } } } }, - "Delete Alert Profile" : { - "comment" : "A button that deletes a glucose alert profile.", - "isCommentAutoGenerated" : true - }, - "Delete All" : { - "comment" : "Button title to delete all objects", + "Loop has detected an missed meal and estimated its size. Edit the carb amount to match the amount of any carbs you may have eaten." : { + "comment" : "Warning displayed when user is adding a meal from an missed meal notification", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Slet alle" + "value" : "Loop har opdaget et overset måltid og vurderet dets størrelse. Rediger mængden af kulhydrater, så den svarer til mængden af kulhydrater, du har spist." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Alle löschen" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminar Todos" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Poista kaikki" + "value" : "Loop hat eine vergessene Mahlzeit erkannt und deren Größe geschätzt. Passe die KH auf die Menge an, die Du wahrscheinlich gegessen hast." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer tout" + "value" : "Loop a détecté un repas manqué et a estimé sa taille. Modifiez la quantité de glucides pour qu'elle corresponde à la quantité de glucides que vous avez peut-être mangée." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מחק הכל" + "value" : "Loop זיהה ארוחה שלא הוזנה והעריך את גודלה. ערוך את מספר הפחמימות כדי להתאים אותו לזה שאכלת." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Elimina tutto" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "すべて削除" + "value" : "Loop ha rilevato un pasto saltato e ne ha stimato le dimensioni. Modifica la quantità di carboidrati in modo che corrisponda alla quantità di carboidrati che potresti aver mangiato." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Slett alle" + "value" : "Loop har oppdaget et glemt måltid og estimert størrelsen. Rediger karbohydratmengden for å matche mengden av karbohydrater du måtte ha spist." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Verwijder alles" + "value" : "Loop heeft een gemiste maaltijd gedetecteerd en een schatting van de hoeveelheid gedaan. Bewerk de hoeveelheid koolhydraten, zodat deze overeenkomt met de hoeveelheid koolhydraten die je mogelijk hebt gegeten." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Usuń wszystko" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Remover Todos" - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ștergeți tot" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Удалить все" + "value" : "Pętla wykryła pominięty posiłek i oszacowała jego wielkość. Edytuj ilość węglowodanów, aby odpowiadała ilości węglowodanów, które mogłeś zjeść." } }, - "sv" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Radera allt" + "value" : "Loop a detectat o masă neanunțată și a estimat dimensiunea acesteia. Editați cantitatea de carbohidrați pentru a se potrivi cu cantitatea de carbohidrați pe care ați consumat-o." } }, - "tr" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Hepsini sil" + "value" : "Loop обнаружил пропущенный прием пищи и оценил его размер. Отредактируйте количество углеводов, чтобы оно соответствовало количеству тех углеводов, которые вы, возможно, съели." } }, - "vi" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Xóa hết" + "value" : "Loop atlanmış bir öğün tespit etti ve boyutunu tahmin etti. Yemiş olabileceğiniz karbonhidrat miktarına uyması için karbonhidrat miktarını düzenleyin." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "删除所有" + "value" : "Loop 检测到一次可能遗漏的进食,并估算了碳水量。请根据实际摄入情况修改碳水数值。" } } } }, - "Delete All Testing Data" : { - "comment" : "The title of an alert that lets the user delete all their testing data.", - "isCommentAutoGenerated" : true - }, - "Delete CGM" : { - "comment" : "Button title to delete CGM", + "Loop has not completed successfully in %@" : { + "comment" : "The notification alert describing a long-lasting loop failure. The substitution parameter is the time interval since the last loop", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "حذف CGM" + "value" : "لم تتم الحلقة المغلقة بنجاح منذ %@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Slet CGM" + "value" : "Loop har ikke kørt korrekt i %@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "CGM löschen" + "value" : "Loop wurde nicht erfolgreich abgeschlossen seit %@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Eliminar MCG" + "value" : "Loop no ha terminado correctamente en %@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Poista CGM" + "value" : "Häiriö Loopin toiminnassa %@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer le CGM" + "value" : "Loop n'a pas bouclé avec succès depuis %@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מחק חיישן" + "value" : "Loop has not completed successfully in %@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Elimina CGM" + "value" : "Loop non ha funzionato correttamente per %@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "CGMを削除" + "value" : "ループが %@ の間クローズされていません" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Slett CGM" + "value" : "Loop har ikke fullført i %@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Verwijder CGM" + "value" : "Loop is niet goed afgerond in %@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Usuń CGM" + "value" : "Loop nie działał poprawnie przez %@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Remover CGM" + "value" : "Nenhum ciclo completo com sucesso em %@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ștergeți senzor de glicemie" + "value" : "Loop nu a rulat cu succes timp de %@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Удалить мониторинг" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odstrániť CGM" + "value" : "Ну удалось успешно замкнуть цикл/контур в %@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Radera CGM" + "value" : "Loop har inte lyckats köra på %@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "CGM Sil" + "value" : "Döngü %@ içinde başarıyla tamamlanamadı" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Xóa CGM" + "value" : "Loop không hoạt động thành công trong %@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "删除CGM" + "value" : "Loop运行异常 %@" } } } }, - "Delete Dose" : { - "comment" : "Button to delete a dose" - }, - "Delete External Insulin" : { - "comment" : "Button to delete a manually-entered insulin dose" + "Loop is already looping." : { + "comment" : "The error message displayed for LoopError.loopInProgress errors." }, - "Delete Food" : { + "Loop normally gives 40% of your predicted insulin needs each dosing cycle.\n\nWhen the Glucose Based Partial Application experiment is enabled, Loop will vary the percentage of recommended bolus delivered each cycle with glucose level.\n\nNear correction range, it will use 20% (similar to Temp Basal), and gradually increase to a maximum of 80% at high glucose (200 mg/dL, 11.1 mmol/L).\n\nPlease be aware that during fast rising glucose, such as after an unannounced meal, this feature, combined with velocity and retrospective correction effects, may result in a larger dose than your ISF would call for." : { + "comment" : "Description of Glucose Based Partial Application toggle.", "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Slet mad" - } - }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Essen löschen" + "value" : "Loop verabreicht normalerweise 40% Deines voraussichtlichen Insulinbedarfs pro Dosierungszyklus. \n\nWenn das Experiment zur glukosebasierten partiellen Verabreichung aktiviert ist (Glucose Based Partial Application), variiert Loop den Prozentsatz des empfohlenen Bolus, der pro Zyklus verabreicht wird, je nach Glukosespiegel. \n\nNahe dem unterem Korrekturbereich werden 20% verwendet (ähnlich wie bei Temp Basal) und bei hohem Glukosespiegel (200 mg/dl, 11,1 mmol/l) schrittweise auf maximal 80% erhöht. \n\nBitte beachte, dass diese Funktion bei schnell ansteigendem Glukosespiegel, etwa nach einer unangekündigten Mahlzeit, in Kombination mit Geschwindigkeits- und retrospektiven Korrektureffekten zu einer höheren Dosis führen kann, als Dein ISF erfordern würde." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer l'aliment" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elimina cibo" + "value" : "Loop administre normalement 40 % des besoins prévus en insuline à chaque cycle de dosage.\n\nLorsque l'application partielle basée sur la glycémie est activée, Loop fait varier le pourcentage du bolus recommandé administré à chaque cycle en fonction du niveau de glucose.\n\nÀ proximité de la plage de correction, il utilisera 20 % (similaire à Temp Basal), et augmentera progressivement jusqu'à un maximum de 80 % à un niveau de glucose élevé (200 mg/dL, 11,1 mmol/L).\n\nVeuillez noter qu'en cas d'augmentation rapide du glucose, par exemple après un repas non annoncé, cette fonction, combinée aux effets de vitesse et de correction rétrospective, peut entraîner une dose plus importante que ce que votre ISF préconise." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Slett mat" + "value" : "Loop gir normalt 40 % av det forventede insulinbehovet ditt i hver doseringssyklus. Når eksperimentet Glukosebasert delvis tilførsel er aktivert, vil Loop variere prosentandelen av anbefalt bolus som gis i hver syklus med glukosenivået.\n\nI nærheten av korreksjonsområdet vil den bruke 20 % (på samme måte som Temp Basal), og gradvis øke til maksimalt 80 % ved høyt glukosenivå (200 mg/dL, 11,1 mmol/L). Vær oppmerksom på at ved raskt stigende glukose, for eksempel etter et uanmeldt måltid, kan denne funksjonen, kombinert med hastighet og retrospektive korreksjonseffekter, resultere i en større dose enn det ISF-en din ville ha krevd." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voedingsmiddel verwijderen" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuń jedzenie" + "value" : "Loop geeft normaal gesproken per doseercyclus 40% van je voorspelde insulinebehoefte.\n\nAls het experiment Glucose-afhankelijke gedeeltelijke toediening aan staat, past Loop het percentage van de aanbevolen bolus dat per cyclus wordt toegediend aan op je glucosewaarde.\n\nIn de buurt van je correctiebereik is dat 20% (vergelijkbaar met Tijdelijke basaal). Bij hoge glucose loopt het geleidelijk op tot maximaal 80% (200 mg/dL, 11,1 mmol/L).\n\nLet op: bij snel stijgende glucose, zoals na een niet-ingevoerde maaltijd, kan deze functie samen met de effecten van snelheid en retrospectieve correctie een grotere dosis geven dan je ISF zou aangeven." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ștergeți alimentele" + "value" : "În mod normal, Loop furnizează 40% din necesarul de insulină estimat pentru fiecare ciclu de dozare. \n \nCând algoritmul experimental Aplicare parțială bazată pe glicemie este activat, Loop o să varieze procentul de bolus recomandat administrat pentru fiecare ciclu în funcție de nivelul glicemiei.\n \nÎn apropierea intervalului de corecție, va utiliza 20% (similar cu o bazală temporar) și va crește treptat până la maximum 80% la glicemie ridicată (200 mg/dl, 11,1 mmol/l). \n \nVă rugăm să rețineți că în timpul creșterii rapide a glicemiei, cum ar fi după o masă neanunțată, această funcție, combinată cu efectele vitezei și ale corecției retrospective, poate duce la o doză mai mare decât ar necesita sensibilitatea dumneavoastră la insulină." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "删除食物" + "value" : "Loop 通常在每个给药周期中提供您预测胰岛素需求的 40%。\n\n启用“基于血糖的部分给药实验功能”后,Loop 将根据血糖水平调整每个周期实际推注的大剂量比例。\n\n当血糖接近矫正目标范围时,仅注射 20%(类似于临时基础率),血糖升高时比例会逐步增加,在高血糖状态(200 mg/dL,11.1 mmol/L)时最高可达 80%。\n\n请注意,当血糖快速上升(例如未申报的进食)时,该功能与血糖变化速度及回顾性矫正机制叠加,可能导致注射剂量超过由胰岛素敏感系数(ISF)计算出的剂量。" } } } }, - "Delete Service" : { - "comment" : "Button title to delete a service", - "extractionState" : "manual", + "Loop will automatically bolus when insulin needs are above scheduled basal, and will use temporary basal rates when needed to reduce insulin delivery below scheduled basal." : { + "comment" : "Description string for automatic bolus dosing strategy", "localizations" : { - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Smazat službu" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Slet service" + "value" : "Loop vil automatisk give bolus, når insulinbehov er over planlagt basal, og vil bruge midlertidige basalrater, når det er nødvendigt for at reducere insulinlevering under planlagt basal." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Dienst löschen" + "value" : "Loop gibt automatisch einen Bolus ab, wenn der Insulinbedarf über der geplanten Basalrate liegt, und verwendet temporäre Basalraten, wenn dies erforderlich ist, um die Insulinabgabe unter die geplante Basalrate zu reduzieren." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Eliminar servicio" + "value" : "Loop administrará bolos automáticamente cuando las necesidades de insulina estén por encima del basal programado y utilizará ajustes temporales de basal cuando sea necesario para reducir la administración de insulina por debajo del basal programado." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Poista palvelu" + "value" : "Loop annostelee automaattisen boluksen kun insuliinitarve ylittää ohjelmoidun basaalin, ja käyttää tilapäisiä alhaisempia basaalitasoja kun tarvitaan vähemmän insuliinia." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer le service" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "מחק שירות" + "value" : "Loop effectue automatiquement des bolus lorsque les besoins en insuline sont supérieurs au débit de base programmé, et utilise des débits basaux temporaires si nécessaire pour réduire l'administration d'insuline en dessous du débit de base programmé." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Elimina servizio" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete Service" + "value" : "Loop eseguirà automaticamente il bolo quando il fabbisogno d'insulina è superiore alla basale programmata e utilizzerà velocità basali temporanee quando necessario per ridurre l'erogazione d'insulina al di sotto della basale programmata." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Slett tjeneste" + "value" : "Lopp vil sette bolus når insulinbehovet er over planlagt basal, og vil bruke midlertidige basale rater når det er nødvendig for å redusere insulintilførselen under planlagt basal" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Service verwijderen" + "value" : "Loop zal automatisch bolussen geven wanneer de insulinebehoefte groter is dan het ingestelde basaal, en Loop zal wanneer dat nodig is gebruik maken van tijdelijke basaalsnelheden om insulinetoediening te verlagen." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Usuń usługę" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete Service" + "value" : "Pętla automatycznie poda bolusa, kiedy zapotrzebowanie na insulinę przekroczy zaplanowaną dawkę podstawową, a w razie potrzeby zredukuje zaplanowaną dawkę podstawową (bazę)." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ștergeți serviciul" + "value" : "Loop va bolusa automat când necesarul de insulină este deasupra bazalei programate, și va utiliza rate bazale temporare atunci când este necesar, pentru a reduce cantitatea de insulină administrată sub nivelul bazal programat." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Удалить сервис" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odstrániť službu" + "value" : "Loop автоматически вводит болюсы, когда потребность в инсулине превышает запланированную базу, и при необходимости использует ВБС, чтобы снизить подачу инсулина ниже запланированной базы." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ta bort tjänst" + "value" : "Loop kommer att ge bolus automatiskt när insulinbehovet är större än ordinarie basal och kommer, vid behov, att minska din ordinarie basal med temporära basaldoser för att minska insulintillförseln." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Servisi Sil" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete Service" + "value" : "Loop, insülin ihtiyaçları programlanan bazalın üzerine çıktığında otomatik olarak bolus yapacak ve gerektiğinde insülin iletimini programlanan bazalın altına düşürmek için geçici bazal oranları kullanacaktır." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "删除服务" + "value" : "当所需胰岛素高于计划基础率时,Loop 将自动推注大剂量;当所需胰岛素低于计划基础率时,则使用临时基础率以减少胰岛素输注" } } } }, - "Delete Testing CGM Data" : { + "Loop will not work successfully until Bluetooth is enabled. You will not receive glucose readings, or be able to bolus." : { + "comment" : "Bluetooth off background alert body.", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Slet CGM testdata" + "value" : "Loop vil ikke fungere, før Bluetooth er aktiveret. Du vil ikke modtage glukoseaflæsninger eller være i stand til at give bolus." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "CGM-Test-Daten löschen" + "value" : "Loop funktioniert nicht, bis Bluetooth aktiviert ist. Du erhältst keine Blutzuckerwerte und es kann kein Bolus abgeben werden." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Eliminar prueba de datos CGM" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Poista testi-CGM:n tiedot" + "value" : "Loop no funcionará correctamente hasta que el Bluetooth esté habilitado. No recibirá lecturas de glucosa ni podrá administrar bolus." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Effacer les données de test du CGM" + "value" : "Loop ne fonctionnera pas correctement tant que le Bluetooth ne sera pas activé. Vous ne pourrez pas recevoir de lectures de glucose, ni être en mesure de faire un bolus." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מחק נתוני בדיקת חיישן" + "value" : "Loop לא תעבוד עד הפעלת Bluetooth. לא תוכל לקבל נתוני גלוקוז או להזריק בולוס." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Elimina dati test CGM" + "value" : "Loop non funzionerà correttamente fino a quando il Bluetooth non sarà attivato. Non riceverai letture glicemiche né potrai eseguire il bolo." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Slett testdata for blodsukkermåler" + "value" : "Loop vil ikke fungere før Bluetooth er aktivert. Du vil ikke motta blodsukkermålinger, eller være i stand til å gi bolus." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Verwijder test-CGM-gegevens" + "value" : "Loop werkt pas als Bluetooth is ingeschakeld. Je zult geen glucosemetingen ontvangen of een bolus kunnen toedienen." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Usuń testowe dane CGM" + "value" : "Pętla nie będzie działać pomyślnie, dopóki Bluetooth nie zostanie włączony. Nie będziesz otrzymywać odczytów poziomu glukozy ani możliwości podania bolusa." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ștergeți datele senzorului de test" + "value" : "Loop nu va funcționa cu succes până când Bluetooth nu este activat. Nu veți primi citiri de glicemie sau nu veți putea să bolusați." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Удалить данные тестирования CGM" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ta bort simulerade testvärden från CGM" + "value" : "Loop не будет успешно работать, пока не будет включен Bluetooth. Вы не сможете получать показания уровня глюкозы или вводить болюсы." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Test CGM Verilerini Sil" + "value" : "Bluetooth etkinleştirilene kadar döngü başarılı bir şekilde çalışmayacaktır. KŞ ölçümleri alamayacak veya bolus yapamayacaksınız." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "删除测试 CGM 数据" + "value" : "在启用蓝牙之前,Loop 无法正常工作。您将无法获取血糖读数,也不能执行大剂量输注。" } } } }, - "Delete Testing Data" : { + "Loop will set temporary basal rates to increase and decrease insulin delivery." : { + "comment" : "Description string for temp basal only dosing strategy", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Slet testdata" + "value" : "Loop vil fastsætte midlertidige basalrater for at øge og reducere insulinafgivelse." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Test-Daten löschen" + "value" : "Loop stellt temporäre Basalraten ein, um die Insulinabgabe zu erhöhen oder zu verringern." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Eliminar datos de prueba" + "value" : "Loop establecerá basal temporales para aumentar y disminuir la administración de insulina." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Poista testitiedot" + "value" : "Loop käyttää tilapäisiä basaalitasoja lisätäkseen tai vähentääkseen insuliinin annostelua." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer les données de Test" + "value" : "Loop permet de définir des débits de base temporaires pour augmenter et diminuer l'administration d'insuline." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מחק נתוני בדיקה" + "value" : "Loop תגדיר בזאלי זמני כדי להגדיל ולהקטין מתן אינסולין." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Elimina dati test" + "value" : "Loop imposterà velocità basali temporanee per aumentare e diminuire l'erogazione d'insulina." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Slett testdata" + "value" : "Loop vil sette midlertidige basal rater for å øke og redusere insulin levering." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Testgegevens verwijderen" + "value" : "Loop stelt tijdelijke basaalsnelheden in om de insulinetoediening te verhogen of te verlagen." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Usuń dane testowe" + "value" : "Pętla ustawi tymczasowe dawki podstawowe, aby zwiększać lub zmniejszyć podawanie insuliny." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ștergeți datele de testare" + "value" : "Loop va stabili ratele bazale temporare pentru a crește și reduce cantitatea de insulina administrată." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Удалить данные тестирования" + "value" : "Петля установит ВБС для увеличения или уменьшения подачи инсулина." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ta bort simulerade testvärden" + "value" : "Loop kommer att ställa in tillfälliga basalnivåer för att öka eller minska insulintillförsel." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Test Verilerini Sil" + "value" : "Loop, insülin iletimini artırmak ve azaltmak için geçici bazal oranlar ayarlayacaktır." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "删除测试数据" + "value" : "Loop 将设置临时基础率,以增加或减少胰岛素输注。" } } } }, - "Delete Testing Pump Data" : { + "Low" : { + "comment" : "Time-in-range band label (54–69 mg/dL)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "منخفض" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nízká" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Slet testdata for pumpe" + "value" : "Lav" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Pumpen-Test-Daten löschen" + "value" : "Niedrig" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Borrar los datos de prueba de la bomba" + "value" : "Baja" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Poista testipumpun tiedot" + "value" : "Matala" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Supprimer les données de la Pompe de test" + "value" : "Basse" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מחק נתוני בדיקת משאבה" + "value" : "נמוך" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alacsony" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Elimina dati test della pompa" + "value" : "Bassa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "低値" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Slett data for testpumpe" + "value" : "Lav" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Testpompgegevens verwijderen" + "value" : "Laag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Usuń dane pompy testowej" + "value" : "Niska" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baixa" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ștergeți datele pompei de test" + "value" : "Scăzută" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Удалить данные тестирования помпы" + "value" : "Низкая" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nízka" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ta bort simulerade pumpvärden" + "value" : "Lågt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Test Pompası Verilerini Sil" + "value" : "Düşük" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Низька" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thấp" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "删除测试用胰岛素泵数据" + "value" : "低" } } } }, - "Delete this dose?" : { - "comment" : "Confirmation title for deleting a dose" - }, - "Delete this manually-entered insulin entry?" : { - "comment" : "Confirmation title for deleting a manually-entered insulin dose" - }, - "Deliver" : { - "comment" : "Button text to deliver a bolus", + "Low Glucose" : { + "comment" : "Title for bolus screen warning when glucose is below glucose warning limit.\nTitle for bolus screen warning when glucose is below suspend threshold, but a bolus is recommended", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Afgiv" + "value" : "Lav glukose" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Abgeben" + "value" : "Niedriger Blutzucker" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Entregar" + "value" : "Glucosa baja" } }, - "fi" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Annostele" + "value" : "Glycémie basse" } }, - "fr" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Administrer" + "value" : "גלוקוז נמוך" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Eroga" + "value" : "Glicemia bassa" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Gi bolus" + "value" : "Lavt blodsukker" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Toedienen" + "value" : "Lage glucose" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Podaj Bolus" + "value" : "Niski poziom glukozy" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Administrați" + "value" : "Glicemie scăzută" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Подать" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Podať" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ge bolus" + "value" : "Низкий уровень глюкозы" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İlet" + "value" : "Düşük KŞ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "输注" + "value" : "低血糖" } } } }, - "Delivery Details" : { - + "Make sure to keep Notifications and Time Sensitive Notifications turned ON in iOS Settings to receive essential safety and maintenance notifications." : { + "comment" : "Time sensitive notifications callout message when Critical Alerts are unavailable" }, - "Delivery Limits" : { - "comment" : "Title text for delivery limits", - "extractionState" : "manual", + "Make sure to keep Notifications, Time Sensitive Notifications, and Critical Alerts turned ON in iOS Settings to receive essential safety and maintenance notifications." : { + "comment" : "Time sensitive notifications callout message" + }, + "Manage iOS Permissions" : { + "comment" : "Manage Permissions in Settings button text" + }, + "Manage Permissions in Settings" : { + "comment" : "Manage Permissions in Settings button text", + "extractionState" : "stale", "localizations" : { - "ar" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "حدود الضخ" + "value" : "Administrer tilladelser i Indstillinger" } }, - "cs" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Limity podávání" + "value" : "Berechtigungen in den Einstellungen verwalten" } }, - "da" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Insulingrænser" + "value" : "Administrar permisos en Configuración" } }, - "de" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Abgabelimits" + "value" : "Gérer les permissions dans les paramètres" } }, - "en" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Delivery Limits" + "value" : "קבע הרשאות בהגדרות" } }, - "es" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Límites de Administración de Insulina" + "value" : "Gestisci le autorizzazioni in Impostazioni" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Annostelurajat" + "value" : "Behandle tillatelser i Innstillinger" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Limites d'Administration" + "value" : "Beheer toestemming in Instellingen" } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Delivery Limits" + "value" : "Zarządzaj uprawnieniami w Ustawieniach" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Limiti erogazione" + "value" : "Gestionați permisiunile din Setări" } }, - "ja" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "注入限度" + "value" : "Управление разрешениями в настройках" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Leveringsgrenser" + "value" : "Ayarlarda İzinleri Yönetin" } }, - "nl" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Toedieningslimieten" + "value" : "在系统设置中配置权限" + } + } + } + }, + "Manager Identifier" : { + + }, + "Managing Alerts" : { + "comment" : "View title for how mute alerts work", + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administration af advarsler" } }, - "pl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Limity podawania" + "value" : "Verwalten von Warnungen" } }, - "pt-BR" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Limites de Entrega" + "value" : "Gestion des Alertes" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Limite de administrare" + "value" : "Gestione degli avvisi" } }, - "ru" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Пределы подачи" + "value" : "Administrere varsler" } }, - "sk" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Limity podávania" + "value" : "Waarschuwingen beheren" } }, - "sv" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Maxdoser" + "value" : "Zarządzanie alertami" } }, - "tr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "İletim Limitleri" + "value" : "Gestionarea alertelor" } }, - "vi" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Giới hạn liều tiêm" + "value" : "Управление оповещениями" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "输注限制" + "value" : "管理警报" } } } }, - "Denied" : { - "comment" : "Health sharing status: denied" - }, - "Depending on the activity, you may notice a few common patterns when it comes to your insulin needs:" : { - - }, - "Device Issue" : { - "comment" : "title for when automation is off and there is a device issue" - }, - "Devices" : { - - }, - "Diabetes Treatment" : { - "comment" : "Descriptive text for Therapy Settings", + "Manual" : { "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Diabetesbehandling" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Diabetes-Behandlung" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tratamiento de la diabetes" - } - }, - "fi" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Diabeteshoito" + "value" : "يدوي" } }, - "fr" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Traitement du diabète" + "value" : "Ručně" } }, - "it" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Terapia" + "value" : "Manuel" } }, - "nb" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Diabetesbehandling" + "value" : "Manuell" } }, - "nl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Diabetesbehandeling" + "value" : "Manual" } }, - "pl" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "w leczeniu cukrzycy" + "value" : "Manuaalinen" } }, - "ro" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tratamentul diabetului" + "value" : "Manuel" } }, - "ru" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Лечение диабета" + "value" : "ידני" } }, - "sv" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Diabetesbehandling" + "value" : "Kézi" } }, - "tr" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Diyabet Tedavisi" + "value" : "Manuale" } }, - "zh-Hans" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "糖尿病治疗" + "value" : "手動" } - } - } - }, - "Did you intend to enter %1$@ grams as the amount of carbohydrates for this meal?" : { - "comment" : "Alert body when entered carbohydrates is greater than threshold (1: entered quantity in grams)", - "localizations" : { - "da" : { + }, + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Havde du til hensigt at angive %1$@ gram som mængden af kulhydrater for dette måltid?" + "value" : "Manuell" } }, - "de" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Wolltest Du %1$@ Gramm an Kohlenhydraten für diese Mahlzeit eingeben?" + "value" : "Handmatig" } }, - "es" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "¿Quería introducir %1$@ gramos como cantidad de hidratos de carbono para esta comida?" + "value" : "Ręcznie" } }, - "fr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Aviez-vous l'intention d'entrer %1$@ grammes comme quantité de glucides pour ce repas?" + "value" : "Manual" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Intendevi inserire %1$@ grammi come quantità di carboidrati per questo pasto?" + "value" : "Manual" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Hadde du tenkt å angi %1$@ gram som mengde karbohydrater for dette måltidet?" + "value" : "Вручную" } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Was je van plan om %1$@ gram in te voeren als hoeveelheid koolhydraten voor deze maaltijd?" + "value" : "Ručne" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Czy zamierzałeś wprowadzić %1$@ gramów jako ilość węglowodanów dla tego posiłku?" + "value" : "Manuell" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Ați intenționat să introduceți %1$@ grame drept cantitate de carbohidrați pentru această masă?" + "value" : "Manuel" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Вы намеревались ввести %1$@ граммов углеводов для этого блюда?" + "value" : "Вручну" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bu yemek için karbonhidrat miktarı olarak %1$@ gram girmeyi düşündünüz mü?" + "value" : "Thủ công" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "你确定本餐包含 %1$@ g 碳水吗?" + "value" : "手动" } } } }, - "Difficulty maintaining exercise or holding a conversation." : { - - }, - "Disables" : { - "comment" : "The action hint of the workout mode toggle button when enabled", - "extractionState" : "stale", + "Manual · %1$@" : { + "comment" : "Logbook temp basal row subtitle: set by hand, then the rate and how long. (1: description, e.g. 0.50 U/h for 30m (scheduled 0.80))", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تعطيل" + "value" : "يدوي · %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ručně · %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Deaktiverer" + "value" : "Manuel · %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Deaktivieren" + "value" : "Manuell · %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Desactivar" + "value" : "Manual · %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Poistaa käytöstä" + "value" : "Manuaalinen · %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Désactive" + "value" : "Manuel · %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Disables" + "value" : "ידני · %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kézi · %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Disattiva" + "value" : "Manuale · %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "無効にする" + "value" : "手動 · %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Deaktiverer" + "value" : "Manuell · %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Uitschakelen" + "value" : "Handmatig · %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wyłącza" + "value" : "Ręcznie · %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Desativa" + "value" : "Manual · %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Dezactivează" + "value" : "Manual · %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Отключает" + "value" : "Вручную · %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ručne · %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Stänger av" + "value" : "Manuell · %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Devre Dışı" + "value" : "Manuel · %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вручну · %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Vô hiệu hóa" + "value" : "Thủ công · %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "禁用" + "value" : "手动 · %1$@" } } } }, - "Dismiss" : { - "comment" : "Default alert dismissal", + "Median" : { + "comment" : "Trends Daily pattern legend: the median glucose line", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تجاهل" + "value" : "الوسيط" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medián" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Afvis" + "value" : "Median" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Schließen" + "value" : "Median" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ignorar" + "value" : "Mediana" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ohita" + "value" : "Mediaani" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Fermer" + "value" : "Médiane" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בטל" + "value" : "חציון" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medián" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Mediana" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "閉じる" + "value" : "中央値" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Avvis" + "value" : "Median" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Sluiten" + "value" : "Mediaan" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Rozumiem" + "value" : "Mediana" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Dispensar" + "value" : "Mediana" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Anulați" + "value" : "Mediană" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Отклонить" + "value" : "Медиана" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Medián" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Avfärda" + "value" : "Median" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Reddet" + "value" : "Medyan" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Медіана" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Từ bỏ" + "value" : "Trung vị" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "忽略" + "value" : "中位数" } } } }, - "Display colors for glucose" : { - "comment" : "Title for glucose coloring", + "Missing data error" : { + "comment" : "Reason Loop could not run: data it needs was missing", "localizations" : { - "de" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Farben für Blutzucker anzeigen" + "value" : "خطأ بيانات مفقودة" } }, - "fr" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Afficher les couleurs du glucose" + "value" : "Chyba chybějících dat" } }, - "nb" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Vis fargene for glukose." + "value" : "Fejl: manglende data" } }, - "nl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kleuren tonen voor glucose" + "value" : "Fehler: fehlende Daten" } }, - "ro" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Afișați culorile pentru glicemie" + "value" : "Error de datos faltantes" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "血糖颜色显示" - } - } - } - }, - "Display Control Options" : { - "comment" : "A section header in the live activity settings view, describing the control options for displaying glucose levels on the live activity screen.", - "isCommentAutoGenerated" : true, - "localizations" : { - "de" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Optionen zur Anzeigesteuerung" + "value" : "Tietoja puuttuu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Options de contrôle de l'affichage" + "value" : "Erreur de données manquantes" } }, - "nb" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Vis kontrollopsjonene" + "value" : "שגיאת נתונים חסרים" } }, - "nl" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Weergaveopties" + "value" : "Hiányzó adat" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Afișați opțiunile de control" + "value" : "Errore dati mancanti" } }, - "zh-Hans" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "显示控制选项" + "value" : "データ欠落エラー" } - } - } - }, - "Display prediction in plot" : { - "comment" : "Title for prediction line toggle", - "localizations" : { - "de" : { + }, + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "BZ-Vorhersage im Diagramm anzeigen" + "value" : "Feil: manglende data" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Afficher la prédiction dans le graphique" + "value" : "Fout: ontbrekende gegevens" } }, - "nb" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Vis prognosen i et diagram." + "value" : "Błąd brakujących danych" } }, - "nl" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Voorspelling tonen in grafiek" + "value" : "Erro de dados ausentes" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Afișați predicția în grafic" + "value" : "Eroare: date lipsă" } }, - "zh-Hans" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "在图中显示预测结果" + "value" : "Ошибка: нет данных" } - } - } - }, - "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.", - "localizations" : { - "de" : { + }, + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Es werden bis zu 4 Elemente angezeigt. Die Bezeichnungen werden in Klammern angegeben." + "value" : "Chyba chýbajúcich údajov" } }, - "fr" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Affiche jusqu'à 4 éléments. La forme abrégée du libellé figure entre parenthèses." + "value" : "Data saknas" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Vis opp til 4 elementer. Visningsetiketten står i parantes." + "value" : "Eksik veri hatası" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Toon maximaal 4 items. Het label staat tussen haakjes." + "value" : "Помилка: немає даних" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Afișați până la 4 elemente. Eticheta de afișare este în paranteze." + "value" : "Lỗi thiếu dữ liệu" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "最多显示4个项目。括号内为显示标签。" + "value" : "数据缺失错误" } } } }, - "Don't Start" : { - "comment" : "Label for do not start preset action on scheduled preset reminder alert\nThe title of the notification action to not start a preset" - }, - "Done" : { + "Needs 10 days of CGM" : { + "comment" : "Trends GMI tile detail when fewer than 10 days of CGM data are available", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يحتاج إلى 10 أيام من CGM" + } + }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Hotovo" + "value" : "Vyžaduje 10 dní CGM" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Udført" + "value" : "Kræver 10 dages CGM" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Fertig" + "value" : "Benötigt 10 Tage CGM" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Completado" + "value" : "Requiere 10 días de CGM" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Valmis" + "value" : "Vaatii 10 päivää CGM-dataa" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Terminé" + "value" : "Nécessite 10 jours de CGM" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בוצע" + "value" : "נדרשים 10 ימי CGM" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 nap CGM-adat szükséges" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Fine" + "value" : "Servono 10 giorni di CGM" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGMデータが10日分必要" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ferdig" + "value" : "Krever 10 dager med CGM" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voltooid" + "value" : "Vereist 10 dagen CGM" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Gotowe" + "value" : "Wymaga 10 dni CGM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Requer 10 dias de CGM" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Gata" + "value" : "Necesită 10 zile de CGM" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Готово" + "value" : "Нужно 10 дней CGM" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Hotovo" + "value" : "Vyžaduje 10 dní CGM" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Färdig" + "value" : "Kräver 10 dagars CGM" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tamamlandı" + "value" : "10 günlük CGM gerekir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Потрібно 10 днів CGM" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cần 10 ngày dữ liệu CGM" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "完成" + "value" : "需要 10 天 CGM 数据" } } } }, - "Dose Summary" : { - "comment" : "Title for card to log dose", + "New Interface" : { + "comment" : "Title of the toggle for the redesigned interface", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الواجهة الجديدة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nové rozhraní" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Resumé af dosis" + "value" : "Ny brugerflade" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Dosisübersicht" + "value" : "Neue Oberfläche" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Resumen de dosis" + "value" : "Nueva interfaz" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Annoksen yhteenveto" + "value" : "Uusi käyttöliittymä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Résumé de la dose" + "value" : "Nouvelle interface" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "ממשק חדש" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Új felület" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Riepilogo della dose" + "value" : "Nuova interfaccia" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "新しいインターフェイス" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Dose sammendrag" + "value" : "Nytt grensesnitt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Doseersamenvatting" + "value" : "Nieuwe interface" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Podsumowanie dawki" + "value" : "Nowy interfejs" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nova interface" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Rezumat doză" + "value" : "Interfață nouă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Сводная информация о дозе" + "value" : "Новый интерфейс" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nové rozhranie" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Sammanfattning av dos" + "value" : "Nytt gränssnitt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Doz Özeti" + "value" : "Yeni Arayüz" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Новий інтерфейс" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giao diện mới" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "注射量摘要" + "value" : "新界面" } } } }, - "Dose Type" : { - - }, - "Dosing Strategy" : { - "comment" : "The title of the Dosing Strategy section in settings", + "Next 3 hours" : { + "comment" : "Title of the prediction chart card on the Now screen", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الساعات الثلاث القادمة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Příští 3 hodiny" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Dosingstrategi" + "value" : "Næste 3 timer" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Dosierungsstrategie" + "value" : "Nächste 3 Stunden" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Estrategia de dosificación" + "value" : "Próximas 3 horas" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Annostelutapa" + "value" : "Seuraavat 3 tuntia" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Stratégie de Dosage" + "value" : "3 prochaines heures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "3 השעות הבאות" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Következő 3 óra" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Strategia di dosaggio" + "value" : "Prossime 3 ore" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "今後3時間" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Doseringsstrategi" + "value" : "Neste 3 timer" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Doseerstrategie" + "value" : "Komende 3 uur" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Strategia dawkowania" + "value" : "Następne 3 godziny" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Próximas 3 horas" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Strategie dozare" + "value" : "Următoarele 3 ore" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Режим ввода инсулина" + "value" : "Ближайшие 3 часа" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nasledujúce 3 hodiny" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Strategi för insulinbehandling" + "value" : "Kommande 3 timmar" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Dozlama Stratejisi" + "value" : "Sonraki 3 saat" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Наступні 3 години" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "3 giờ tới" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "剂量策略" + "value" : "未来 3 小时" } } } }, - "Duration" : { - - }, - "Duration exceeds: %1$.1f hours" : { - "comment" : "Override error description: duration exceed max (1: max duration in hours).", + "Next day" : { + "comment" : "Accessibility label for the day page button that steps forward a day", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "اليوم التالي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Další den" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Varigheden overstiger: %1$.1f timer" + "value" : "Næste dag" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Dauer überschritten: %1$.1f Stunden" + "value" : "Nächster Tag" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Día siguiente" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Seuraava päivä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "La durée dépasse : %1$.1f heures" + "value" : "Jour suivant" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "משך זמן חורג: %1$.1f שעות" + "value" : "היום הבא" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Következő nap" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "La durata supera: %1$.1f ore" + "value" : "Giorno successivo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "翌日" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Varigheten overskrider: %1$.1f timer" + "value" : "Neste dag" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Duur overschrijdt: %1$.1f uur" + "value" : "Volgende dag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Czas trwania przekracza: %1$.1f godzin" + "value" : "Następny dzień" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Próximo dia" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Durata depășește: %1$.1f ore" + "value" : "Ziua următoare" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Продолжительность превышает: %1$.1f часов" + "value" : "Следующий день" } }, - "tr" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Süre aşıldı: %1$.1f saat" + "value" : "Ďalší deň" } }, - "zh-Hans" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "持续时间超过: %1$.1f 小时" + "value" : "Nästa dag" } - } - } - }, - "Duration: %@" : { - - }, - "During Preset" : { - "comment" : "Title of a picker view that allows the user to select whether they want to see the data for the preset or the preset plus 6 hours.", - "isCommentAutoGenerated" : true - }, - "During this kind of hard exercise, your body may release hormones that raise glucose. This is more common in the morning before eating." : { - - }, - "Each 1% time in range ≈ 15 minutes." : { - "comment" : "TIR helper" - }, - "Each 5% increase in range is clinically beneficial." : { - "comment" : "TIR suggestion" - }, - "Easy breath. Can carry on a conversation." : { - - }, - "Edit Food" : { - - }, - "Edit Preset" : { - - }, - "Edit presets" : { - + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sonraki gün" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Наступний день" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ngày sau" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "后一天" + } + } + } }, - "Enable\nBluetooth" : { - "comment" : "Message to the user to enable bluetooth", + "Next period" : { + "comment" : "VoiceOver label for the Trends button that moves forward one period", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الفترة التالية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Další období" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiver \nbluetooth" + "value" : "Næste periode" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth einschalten" + "value" : "Nächster Zeitraum" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Activar \nBluetooth" + "value" : "Período siguiente" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ota Bluetooth käyttöön" + "value" : "Seuraava jakso" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Activer \nbluetooth" + "value" : "Période suivante" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הפעל \n בלוטות'" + "value" : "התקופה הבאה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Következő időszak" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Attiva\nBluetooth" + "value" : "Periodo successivo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "次の期間" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiver blåtann" + "value" : "Neste periode" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth\nInschakelen" + "value" : "Volgende periode" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Włączać\nBluetooth" + "value" : "Następny okres" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Próximo período" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Activați\nBluetooth" + "value" : "Perioada următoare" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Включить\nBluetooth" + "value" : "Следующий период" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ďalšie obdobie" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivera Bluetooth" + "value" : "Nästa period" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Etkinleştir\nBluetooth" + "value" : "Sonraki dönem" } }, - "zh-Hans" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "启用蓝牙" + "value" : "Наступний період" } - } - } - }, - "Enable Glucose Based Partial Application" : { - "comment" : "Title for Glucose Based Partial Application toggle", - "localizations" : { - "da" : { + }, + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivér Glucose Based Partial Application" + "value" : "Khoảng thời gian sau" } }, - "de" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose Based Partial Application aktivieren" + "value" : "下一时段" } - }, - "fr" : { + } + } + }, + "Night" : { + "comment" : "Appearance option that always uses dark mode Name of the dark app icon", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Permettre l'application partielle basée sur la glycémie" + "value" : "ليل" } }, - "it" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Attiva Applicazione parziale basata sulla glicemia (GBPA)" + "value" : "Noc" } }, - "nb" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiver delvis anvendelse basert på glukose" + "value" : "Nat" } }, - "nl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose-afhankelijke gedeeltelijke toediening inschakelen" + "value" : "Nacht" } }, - "pl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Włącz Algorytm adaptacyjny" + "value" : "Noche" } }, - "ro" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Activați aplicarea parțială pe bază de glicemie" + "value" : "Yö" } }, - "zh-Hans" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "启用基于血糖的部分输注" + "value" : "Nuit" } - } - } - }, - "Enable Integral Retrospective Correction" : { - "comment" : "Title for Integral Retrospective Correction toggle", - "localizations" : { - "da" : { + }, + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivér Integral Retrospective Correction" + "value" : "לילה" } }, - "de" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Integral Retrospective Correction aktivieren" + "value" : "Éjszaka" } }, - "fr" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Activer la correction rétrospective intégrale" + "value" : "Notte" } }, - "it" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Attiva Correzione retrospettiva integrale (IRC)" + "value" : "夜" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivere integrert retrospektiv korrigering" + "value" : "Natt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Integrale retrospectieve correctie inschakelen" + "value" : "Nacht" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Włącz Integralną Korektę Retrospektywną (IRC)" + "value" : "Noc" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Noite" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Activați corecția retrospectivă integrală" + "value" : "Noapte" } }, - "zh-Hans" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "启用整体回溯校正(IRC)" + "value" : "Ночь" } - } - } - }, - "Enabled" : { - "comment" : "Title for enable live activity toggle", - "localizations" : { - "de" : { + }, + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiviert" + "value" : "Noc" } }, - "fr" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Activé" + "value" : "Natt" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivert" + "value" : "Gece" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Ingeschakeld" + "value" : "Ніч" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Activat" + "value" : "Đêm" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "启用" + "value" : "夜" } } } }, - "Enables" : { - "comment" : "The action hint of the workout mode toggle button when disabled", - "extractionState" : "stale", + "No active insulin or carbs on this day" : { + "comment" : "Day page placeholder when there was no insulin or carbs on board all day", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تفعيل" + "value" : "لا يوجد أنسولين أو كارب نشط في هذا اليوم" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "V tento den nebyl žádný aktivní inzulín ani sacharidy" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiverer" + "value" : "Intet aktivt insulin eller kulhydrater denne dag" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Aktivieren" + "value" : "Kein aktives Insulin und keine aktiven KH an diesem Tag" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Permitir" + "value" : "Sin insulina ni carbohidratos activos este día" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ottaa käyttöön" + "value" : "Ei aktiivista insuliinia tai hiilihydraatteja tänä päivänä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Active" + "value" : "Aucune insuline ni glucides actifs ce jour-là" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Enables" + "value" : "אין אינסולין או פחמימות פעילים ביום זה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ezen a napon nem volt aktív inzulin vagy szénhidrát" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Attiva" + "value" : "Nessuna insulina o carboidrati attivi in questo giorno" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "有効にする" + "value" : "この日は残存インスリンも残存糖質もありません" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Aktiverer" + "value" : "Ingen aktivt insulin eller karbohydrater denne dagen" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Inschakelen" + "value" : "Geen actieve insuline of koolhydraten op deze dag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Włącza" + "value" : "Brak aktywnej insuliny i węglowodanów tego dnia" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Ativar" + "value" : "Sem insulina ou carboidratos ativos neste dia" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Activați" + "value" : "Fără insulină sau carbohidrați activi în această zi" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Включает" + "value" : "В этот день не было активного инсулина или углеводов" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "V tento deň nebol žiadny aktívny inzulín ani sacharidy" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Slår på" + "value" : "Inget aktivt insulin eller kolhydrater denna dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Etkin" + "value" : "Bu gün aktif insülin veya karb yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Цього дня не було активного інсуліну чи вуглеводів" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Cho phép" + "value" : "Không có insulin hoặc Carbs còn hoạt động trong ngày này" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "启用" + "value" : "这一天没有活性胰岛素或碳水" } } } }, - "End" : { - - }, - "End Preset" : { - - }, - "End Time" : { - - }, - "End Training?" : { - - }, - "Ensure that notifications are allowed and NOT silenced from %1$@." : { - "comment" : "Focus modes step 4 (1: appName)" - }, - "Enter a blood glucose from a meter for a recommended bolus amount." : { - "comment" : "Caption for bolus screen notice when glucose data is missing or stale", + "No CGM data" : { + "comment" : "Trends Average tile detail when the period has no glucose readings", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا توجد بيانات CGM" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žádná data CGM" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Indtast blodsukker fra en fingerprikmåling for at få anbefalet en bolusmængde." + "value" : "Ingen CGM-data" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Gib einen Blutzuckerwert von einem Messgerät ein, um eine Bolusempfehlung zu bekommen." + "value" : "Keine CGM-Daten" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ingrese una glucosa en sangre de un medidor por una cantidad recomendada de bolo." + "value" : "Sin datos del CGM" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Syötä sormenpäästä mitattu glukoosiarvo saadaksesi suositellun bolusmäärän." + "value" : "Ei CGM-dataa" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Entrez la glycémie à partir d'un mesure manuelle pour le calcul du bolus." + "value" : "Aucune donnée CGM" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הכנס קריאת מד סוכר כדי לקבל המלצה לכמות בולוס." + "value" : "אין נתוני CGM" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs CGM-adat" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Inserirsci la glicemia capillare per ottenere la quantità di bolo consigliata." + "value" : "Nessun dato CGM" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGMデータなし" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Legg inn blodsukkerverdi fra en måler for anbefalt bolusmengde." + "value" : "Ingen CGM-data" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Verkrijg een bloedglucose waarde van een meter voor een aanbevolen bolus hoeveelheid." + "value" : "Geen CGM-gegevens" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadź poziom glukozy z glukometru, aby uzyskać zalecaną wielkość bolusa." + "value" : "Brak danych CGM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sem dados do CGM" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Introduceți o glicemie luata cu glucometrul pentru o recomandare de bolus." + "value" : "Fără date CGM" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Введите глюкозу крови, полученную с помощью глюкометра, для получения рекомендуемого количества болюса." + "value" : "Нет данных CGM" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne údaje CGM" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Du behöver mata in ett blodsockervärde för att få en rekommenderad bolus." + "value" : "Inga CGM-data" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Önerilen bolus miktarı için bir ölçüm cihazından bir kan şekeri girin." + "value" : "CGM verisi yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає даних CGM" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không có dữ liệu CGM" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "请输入血糖仪测得的血糖值,以获取推荐的大剂量。" + "value" : "无 CGM 数据" } } } }, - "Enter Bolus" : { - "comment" : "Button text to begin entering a bolus", + "No CGM data %1$@ – %2$@" : { + "comment" : "Chart note: a gap in glucose readings. (1: start time; 2: end time)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا توجد بيانات CGM %1$@ – %2$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žádná data CGM %1$@ – %2$@" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Indtast bolus" + "value" : "Ingen CGM-data %1$@ – %2$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus eingeben" + "value" : "Keine CGM-Daten %1$@ – %2$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Introducir bolo" + "value" : "Sin datos del CGM %1$@ – %2$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Syötä bolus" + "value" : "Ei CGM-dataa %1$@ – %2$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Entrer un Bolus" + "value" : "Aucune donnée CGM %1$@ – %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין נתוני CGM %1$@ – %2$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs CGM-adat %1$@ – %2$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Inserisci bolo" + "value" : "Nessun dato CGM %1$@ – %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGMデータなし %1$@ – %2$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Skriv inn bolus" + "value" : "Ingen CGM-data %1$@ – %2$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus invoeren" + "value" : "Geen CGM-gegevens %1$@ – %2$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadź bolus" + "value" : "Brak danych CGM %1$@ – %2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sem dados do CGM %1$@ – %2$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Introduceți bolusul" + "value" : "Fără date CGM %1$@ – %2$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Ввести болюс" + "value" : "Нет данных CGM %1$@ – %2$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne údaje CGM %1$@ – %2$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ange Bolus" + "value" : "Inga CGM-data %1$@ – %2$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus girin" + "value" : "CGM verisi yok %1$@ – %2$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає даних CGM %1$@ – %2$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không có dữ liệu CGM %1$@ – %2$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "输入大剂量" + "value" : "无 CGM 数据 %1$@ – %2$@" } } } }, - "Enter Fingerstick Glucose" : { - "comment" : "Button text prompting manual glucose entry on bolus screen", + "No CGM data %1$@ – %2$@ and %3$@" : { + "comment" : "Chart note: the longest gap in glucose readings, plus the shorter ones. (1: start time; 2: end time; 3: number of shorter gaps, e.g. 2 shorter gaps)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا توجد بيانات CGM %1$@ – %2$@ و %3$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žádná data CGM %1$@ – %2$@ a %3$@" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Indtast fingerprikmåling" + "value" : "Ingen CGM-data %1$@ – %2$@ og %3$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Blutzucker eingeben" + "value" : "Keine CGM-Daten %1$@ – %2$@ und %3$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ingrese la glucosa de punción en el dedo" + "value" : "Sin datos del CGM %1$@ – %2$@ y %3$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Syötä mitattu glukoosiarvo" + "value" : "Ei CGM-dataa %1$@ – %2$@ ja %3$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Entrez la Glycémie capillaire" + "value" : "Aucune donnée CGM %1$@ – %2$@ et %3$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הכנס קריאת מד סוכר" + "value" : "אין נתוני CGM %1$@ – %2$@ ו-%3$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs CGM-adat %1$@ – %2$@, és %3$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Inserirsci glicemia capillare" + "value" : "Nessun dato CGM %1$@ – %2$@ e %3$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGMデータなし %1$@ – %2$@(%3$@)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Legg inn blodsukkerverdi fra fingerstikk" + "value" : "Ingen CGM-data %1$@ – %2$@ og %3$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Vul vingerprikglucose in" + "value" : "Geen CGM-gegevens %1$@ – %2$@ en %3$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadź glukozę z glukometru" + "value" : "Brak danych CGM %1$@ – %2$@ oraz %3$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sem dados do CGM %1$@ – %2$@ e %3$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Introduceți glicemia din deget" + "value" : "Fără date CGM %1$@ – %2$@ și %3$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Введите глюкозу по глюкометру" + "value" : "Нет данных CGM %1$@ – %2$@ и ещё %3$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne údaje CGM %1$@ – %2$@ a %3$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ange kapillärt blodsocker" + "value" : "Inga CGM-data %1$@ – %2$@ och %3$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Parmak Ucu KŞ Girin" + "value" : "CGM verisi yok %1$@ – %2$@ ve %3$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає даних CGM %1$@ – %2$@ і ще %3$@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không có dữ liệu CGM %1$@ – %2$@ và %3$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "输入指尖血糖值" + "value" : "无 CGM 数据 %1$@ – %2$@,%3$@" } } } }, - "Enter glucose safety limit" : { - "comment" : "The placeholder text instructing users to enter a glucose safety limit", + "No CGM data in the last 3 hours" : { + "comment" : "Empty prediction chart on the Now screen", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا توجد بيانات CGM في آخر 3 ساعات" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žádná data CGM za poslední 3 hodiny" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Indtast glucosesikkerhedsgrænse" + "value" : "Ingen CGM-data de seneste 3 timer" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Glukosesicherheitsgrenze eingeben" + "value" : "Keine CGM-Daten in den letzten 3 Stunden" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Introduzca el límite de seguridad de glucosa" + "value" : "Sin datos del CGM en las últimas 3 horas" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Aseta glukoosin turvaraja" + "value" : "Ei CGM-dataa viimeisen 3 tunnin aikana" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Entrez la limite de sécurité du taux de glucose" + "value" : "Aucune donnée CGM ces 3 dernières heures" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הגדרת בטיחות" + "value" : "אין נתוני CGM ב-3 השעות האחרונות" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs CGM-adat az elmúlt 3 órában" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Inserisci limite di sicurezza glicemia" + "value" : "Nessun dato CGM nelle ultime 3 ore" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "過去3時間のCGMデータなし" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Angi sikkerhetsgrensen for blodsukker" + "value" : "Ingen CGM-data de siste 3 timene" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voer glucoseveiligheidslimiet in" + "value" : "Geen CGM-gegevens in de afgelopen 3 uur" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadź bezpieczny limit glukozy" + "value" : "Brak danych CGM z ostatnich 3 godzin" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sem dados do CGM nas últimas 3 horas" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Introduceți limita de siguranță pentru glicemie" + "value" : "Fără date CGM în ultimele 3 ore" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Введите безопасный предел глюкозы" + "value" : "Нет данных CGM за последние 3 часа" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne údaje CGM za posledné 3 hodiny" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ange tröskelvärde för blodsocker" + "value" : "Inga CGM-data de senaste 3 timmarna" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "KŞ güvenlik limitini girin" + "value" : "Son 3 saatte CGM verisi yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає даних CGM за останні 3 години" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không có dữ liệu CGM trong 3 giờ qua" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "输入血糖安全下限" + "value" : "过去 3 小时无 CGM 数据" } } } }, - "Enter suspend threshold" : { - "comment" : "The placeholder text instructing users to enter a suspend treshold", - "extractionState" : "manual", + "No CGM data in this period" : { + "comment" : "Trends chart placeholder when the period has no glucose readings", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "أدخل حد التوقف" + "value" : "لا توجد بيانات CGM في هذه الفترة" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Indtast grænse for suspendering" + "value" : "Žádná data CGM v tomto období" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Grenzwert für Hypo-Abschaltung eingeben" + "value" : "Ingen CGM-data i denne periode" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Enter suspend threshold" + "value" : "Keine CGM-Daten in diesem Zeitraum" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ingrese nivel de suspensión" + "value" : "Sin datos del CGM en este período" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Aseta pysäytysraja" + "value" : "Ei CGM-dataa tällä jaksolla" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Entrez le seuil de suspension" + "value" : "Aucune donnée CGM sur cette période" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Enter suspend threshold" + "value" : "אין נתוני CGM בתקופה זו" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs CGM-adat ebben az időszakban" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Inserisci soglia di sospensione" + "value" : "Nessun dato CGM in questo periodo" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "一時停止値を入力" + "value" : "この期間のCGMデータなし" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Angi suspenderingsgrense" + "value" : "Ingen CGM-data i denne perioden" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voer drempel voor onderbreking in" + "value" : "Geen CGM-gegevens in deze periode" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadź próg zawieszenia pompy" + "value" : "Brak danych CGM w tym okresie" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Digite o limite de suspensão" + "value" : "Sem dados do CGM neste período" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Introduceți limita pentru suspendare" + "value" : "Fără date CGM în această perioadă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Введите рубеж приостановки" + "value" : "Нет данных CGM за этот период" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne údaje CGM v tomto období" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ange tröskelvärde" + "value" : "Inga CGM-data under denna period" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Askıya alma eşiğini girin" + "value" : "Bu dönemde CGM verisi yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає даних CGM за цей період" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Nhập ngưỡng tạm dừng" + "value" : "Không có dữ liệu CGM trong khoảng thời gian này" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "输入暂停阈值" + "value" : "此时段无 CGM 数据" } } } }, - "Error Canceling Bolus" : { - "comment" : "The alert title for an error while canceling a bolus", + "No CGM data on this day" : { + "comment" : "Chart note: there are no glucose readings for the whole day", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "خطأ في إلغاء الجرعة" + "value" : "لا توجد بيانات CGM في هذا اليوم" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žádná data CGM v tento den" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Fejl ved annullering af bolus" + "value" : "Ingen CGM-data denne dag" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Fehler beim Abbrechen des Bolus" + "value" : "Keine CGM-Daten an diesem Tag" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Error de cancelación de bolo" + "value" : "Sin datos del CGM este día" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Virhe boluksen kumoamisessa" + "value" : "Ei CGM-dataa tänä päivänä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Erreur lors de l’annulation du Bolus" + "value" : "Aucune donnée CGM ce jour-là" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Error Canceling Bolus" + "value" : "אין נתוני CGM ביום זה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs CGM-adat ezen a napon" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Errore durante l'annullamento del bolo" + "value" : "Nessun dato CGM in questo giorno" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ボーラスのキャンセルにエラー" + "value" : "この日のCGMデータなし" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Kunne ikke avbryte bolus" + "value" : "Ingen CGM-data denne dagen" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Fout bij annuleren bolus" + "value" : "Geen CGM-gegevens op deze dag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Błąd anulowania bolusa" + "value" : "Brak danych CGM tego dnia" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Erro Cancelando Bolus" + "value" : "Sem dados do CGM neste dia" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Eroare la anularea bolusului" + "value" : "Fără date CGM în această zi" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Ошибка отмены болюса" + "value" : "Нет данных CGM за этот день" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne údaje CGM v tento deň" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Fel vid försök att avbryta bolus" + "value" : "Inga CGM-data denna dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus İptali Hatası" + "value" : "Bu günde CGM verisi yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає даних CGM за цей день" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lỗi hủy liều Bolus" + "value" : "Không có dữ liệu CGM trong ngày này" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无法取消大剂量" + "value" : "这一天无 CGM 数据" } } } }, - "Error Exporting Logs" : { - "comment" : "Critical event log export error alert title", + "No CGM data yet today" : { + "comment" : "Chart note: there are no glucose readings so far today", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا توجد بيانات CGM اليوم حتى الآن" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dnes zatím žádná data CGM" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Der opstod en fejl under eksport af log" + "value" : "Ingen CGM-data endnu i dag" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Fehler beim Exportieren des Protokolls" + "value" : "Heute noch keine CGM-Daten" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Error al exportar registros" + "value" : "Aún no hay datos del CGM hoy" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Virhe lokin viennissä" + "value" : "Ei vielä CGM-dataa tänään" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Erreur lors de l'exportation des journaux" + "value" : "Aucune donnée CGM aujourd'hui pour l'instant" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין עדיין נתוני CGM היום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ma még nincs CGM-adat" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Errore durante l'esportazione dei registri" + "value" : "Ancora nessun dato CGM oggi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "今日はまだCGMデータなし" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Feil ved eksport av logger" + "value" : "Ingen CGM-data ennå i dag" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Fout bij exporteren logboeken" + "value" : "Vandaag nog geen CGM-gegevens" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Błąd podczas eksportowania dzienników" + "value" : "Dziś jeszcze brak danych CGM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ainda sem dados do CGM hoje" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Eroare la exportarea jurnalelor" + "value" : "Încă nu există date CGM azi" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Ошибка экспорта логов" + "value" : "Сегодня пока нет данных CGM" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dnes zatiaľ žiadne údaje CGM" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Fel vid export av loggar" + "value" : "Inga CGM-data än i dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Günlükleri Dışa Aktarırken Hata" + "value" : "Bugün henüz CGM verisi yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сьогодні ще немає даних CGM" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hôm nay chưa có dữ liệu CGM" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "导出日志发生错误" + "value" : "今天尚无 CGM 数据" } } } }, - "Error Resuming" : { - "comment" : "The alert title for a resume error", - "extractionState" : "manual", + "No gaps: Loop ran closed loop all through this period." : { + "comment" : "Trends Gaps list when Loop was in closed loop for the whole period", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "خطأ في الاستئناف" + "value" : "لا فجوات: عمل Loop بالحلقة المغلقة طوال هذه الفترة." } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Fejl ved genoptagelse" + "value" : "Žádné výpadky: Loop běžel v uzavřené smyčce celé období." } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Fehler beim Fortfahren" + "value" : "Ingen huller: Loop kørte lukket Loop i hele perioden." } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Error Resuming" + "value" : "Keine Lücken: Loop lief im gesamten Zeitraum im Closed Loop." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Error Reanudando" + "value" : "Sin interrupciones: Loop funcionó en circuito cerrado durante todo el período." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Virhe jatkamisessa" + "value" : "Ei katkoja: Loop toimi suljetulla säädöllä koko jakson ajan." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Erreur lors de la reprise" + "value" : "Aucune interruption : Loop est resté en boucle fermée toute la période." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Error Resuming" + "value" : "אין פערים: Loop פעל ב-Closed Loop לאורך כל התקופה." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs kimaradás: a Loop az egész időszakban zárt hurokban futott." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Errore durante la ripresa" + "value" : "Nessuna interruzione: Loop è rimasto in loop chiuso per tutto il periodo." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "再開エラー" + "value" : "中断なし:この期間中、Loopは常にクローズドループで動作しました。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Feil ved gjenopptagelse" + "value" : "Ingen hull: Loop kjørte lukket Loop gjennom hele perioden." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Fout bij hervatten" + "value" : "Geen onderbrekingen: Loop draaide de hele periode in actieve loop." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Błąd wznawiania" + "value" : "Brak przerw: Loop działał w pętli zamkniętej przez cały okres." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Erro ao Retomar" + "value" : "Sem interrupções: o Loop ficou em ciclo fechado durante todo o período." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Eroare în timpul reluării" + "value" : "Fără întreruperi: Loop a rulat în buclă închisă toată perioada." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Ошибка возобновления" + "value" : "Пропусков нет: Loop работал в замкнутом цикле весь период." } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Chyba pri obnovení" + "value" : "Žiadne výpadky: Loop bežal v uzavretej slučke celé obdobie." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Fel vid återupptagande" + "value" : "Inga luckor: Loop körde sluten loop under hela perioden." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Sürdürme Hatası" + "value" : "Boşluk yok: Loop bu dönem boyunca kapalı döngüde çalıştı." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Пропусків немає: Loop працював у замкнутому циклі весь період." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lỗi khi đang tái thực hiện" + "value" : "Không gián đoạn: Loop chạy vòng lặp kín suốt khoảng thời gian này." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "恢复输注错误" + "value" : "无中断:此时段内 Loop 一直以闭环运行。" } } } }, - "Event" : { - - }, - "Event History" : { - "comment" : "Segmented button title for insulin delivery log event history", + "No insulin recorded in this period" : { + "comment" : "Trends Insulin per day chart placeholder when no insulin was delivered in the period", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لم يُسجَّل أنسولين في هذه الفترة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "V tomto období nebyl zaznamenán žádný inzulín" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Hændelseshistorik" + "value" : "Intet insulin registreret i denne periode" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ereignisverlauf" + "value" : "Kein Insulin in diesem Zeitraum erfasst" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Historial de Eventos" + "value" : "No se registró insulina en este período" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Tapahtumahistoria" + "value" : "Ei kirjattua insuliinia tällä jaksolla" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Historique des événements" + "value" : "Aucune insuline enregistrée sur cette période" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Event History" + "value" : "לא נרשם אינסולין בתקופה זו" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs rögzített inzulin ebben az időszakban" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Cronologia degli eventi" + "value" : "Nessuna insulina registrata in questo periodo" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Event History" + "value" : "この期間のインスリン記録なし" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Hendelseshistorie" + "value" : "Ingen insulin registrert i denne perioden" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Logboek" + "value" : "Geen insuline vastgelegd in deze periode" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Historia zdarzeń" + "value" : "Brak zapisanej insuliny w tym okresie" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Event History" + "value" : "Nenhuma insulina registrada neste período" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Istoric evenimente" + "value" : "Nicio insulină înregistrată în această perioadă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "История событий" + "value" : "За этот период инсулин не записан" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "V tomto období nebol zaznamenaný žiadny inzulín" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Händelsehistorik" + "value" : "Inget insulin registrerat under denna period" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Etkinlik Geçmişi" + "value" : "Bu dönemde kaydedilmiş insülin yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "За цей період інсулін не записано" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Event History" + "value" : "Không có insulin được ghi lại trong khoảng thời gian này" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "历史事件" + "value" : "此时段内无胰岛素记录" } } } }, - "Eventually" : { - - }, - "Eventually %@" : { - "comment" : "The subtitle format describing eventual glucose. (1: localized glucose value description)", - "extractionState" : "stale", + "No loop runs kept" : { + "comment" : "Trends Loop active tile detail when no Loop run history is available for the period", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "في النهاية %@" + "value" : "لا توجد تشغيلات Loop محفوظة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žádné uložené běhy" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Med tiden %@" + "value" : "Ingen Loop-kørsler gemt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Voraussichtlich %@" + "value" : "Keine Loop-Durchläufe gespeichert" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Eventualmente %@" + "value" : "No se guardaron ejecuciones de Loop" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ennuste %@" + "value" : "Ei tallennettuja Loop-ajoja" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Éventuellement %@" + "value" : "Aucune exécution de Loop conservée" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Eventually %@" + "value" : "לא נשמרו הרצות Loop" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs megőrzött Loop-futás" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Infine %@" + "value" : "Nessuna esecuzione di Loop conservata" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "予想 %@" + "value" : "Loop実行記録なし" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Omsider %@" + "value" : "Ingen Loop-kjøringer lagret" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Uiteindelijk %@" + "value" : "Geen loop-runs bewaard" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Docelowo %@" + "value" : "Brak zapisanych cykli" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Eventualmente %@" + "value" : "Nenhuma execução do Loop guardada" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "În cele din urmă %@" + "value" : "Nu sunt păstrate rulări Loop" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "В конечном итоге %@" + "value" : "Нет сохранённых запусков" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne uložené behy" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Förväntat %@" + "value" : "Inga loopkörningar sparade" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Nihai KŞ %@" + "value" : "Saklanan Loop çalışması yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає збережених запусків" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Kết quả %@" + "value" : "Không lưu lần chạy Loop nào" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "最终 %@" + "value" : "无 Loop 运行记录" } } } }, - "Example" : { - - }, - "Example: Allow Notifications from %1$@" : { - "comment" : "Focus mode image 1 caption (1: appName)" - }, - "Example: Silence Notifications from other apps" : { - "comment" : "Focus mode image 2 caption" - }, - "Exceeds maximum allowed bolus in settings" : { - "comment" : "Bolus error description: bolus exceeds maximum bolus in settings.", + "No loop runs recorded in this period" : { + "comment" : "Trends Loop status placeholder when there is no Loop run history for the period", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Overskrider den maksimalt tilladte bolus i indstillingerne" + "value" : "لم تُسجَّل تشغيلات Loop في هذه الفترة" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Überschreitet den maximal zulässigen Bolus in den Einstellungen" + "value" : "V tomto období nebyly zaznamenány žádné běhy Loop" } }, - "es" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Excede el bolo máximo permitido en la configuración" + "value" : "Ingen Loop-kørsler registreret i denne periode" } }, - "fr" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Dépasse le bolus maximal défini dans les paramètres" + "value" : "Keine Loop-Durchläufe in diesem Zeitraum erfasst" } }, - "it" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Supera il bolo massimo consentito nelle impostazioni" + "value" : "No se registraron ejecuciones de Loop en este período" } }, - "nb" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Overskrider maksimalt tillatt bolus i innstillingene" + "value" : "Ei Loop-ajoja tällä jaksolla" } }, - "nl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Overschrijdt maximale toegestane bolus in instellingen" + "value" : "Aucune exécution de Loop enregistrée sur cette période" } }, - "pl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Przekracza maksymalny dozwolony bolus." + "value" : "לא נרשמו הרצות Loop בתקופה זו" } }, - "ro" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Depășește bolusul maxim permis în setări" + "value" : "Nincs rögzített Loop-futás ebben az időszakban" } }, - "ru" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Превышен максимально допустимый болюс в настройках" + "value" : "Nessuna esecuzione di Loop registrata in questo periodo" } }, - "tr" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Ayarlarda izin verilen maksimum bolusu aşıyor" + "value" : "この期間のLoop実行記録なし" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "超出设定的最大剂量限制" - } - } - } - }, - "Exceeds maximum allowed carbs" : { - "comment" : "Carb error description: carbs exceed maximum amount.", - "localizations" : { - "da" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Overskrider det maksimalt tilladte antal kulhydrater" + "value" : "Ingen Loop-kjøringer registrert i denne perioden" } }, - "de" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Überschreitet die maximal zulässigen Kohlenhydrate" + "value" : "Geen loop-runs vastgelegd in deze periode" } }, - "es" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Supera el máximo permitido de carbohidratos definido en la configuración" + "value" : "Brak zapisanych cykli Loop w tym okresie" } }, - "fr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Dépasse le nombre de glucides maximal accepté" + "value" : "Nenhuma execução do Loop registrada neste período" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Supera i carboidrati massimi consentiti" + "value" : "Nicio rulare Loop înregistrată în această perioadă" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Overskrider maksimalt tillatte karbohydrater" + "value" : "За этот период запуски Loop не записаны" } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Overschrijdt maximale toegestane koolhydraten" + "value" : "V tomto období neboli zaznamenané žiadne behy Loop" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Przekracza maksymalną dopuszczalną ilość węglowodanów" + "value" : "Inga loopkörningar registrerade under denna period" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Depășește maximul de carbohidrați permis" + "value" : "Bu dönemde kaydedilmiş Loop çalışması yok" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Превышено максимально допустимое количество углеводов" + "value" : "За цей період запуски Loop не записано" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "İzin verilen maksimum karbonhidrat miktarını aşıyor" + "value" : "Không có lần chạy Loop nào được ghi lại trong khoảng thời gian này" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "超过最大允许碳水化合物摄入量" + "value" : "此时段内无 Loop 运行记录" } } } }, - "Exceeds Maximum Bolus" : { - "comment" : "Alert title for a maximum bolus validation error", + "No reading" : { + "comment" : "Shown on the Now screen in place of the glucose value when there is no recent CGM reading", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "يتجاوز أقصى جرعة" + "value" : "لا توجد قراءة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žádná hodnota" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Overskrider maksimal bolus" + "value" : "Ingen måling" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Überschreitet den maximalen Bolus" + "value" : "Kein Wert" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Excede bolo máximo" + "value" : "Sin lectura" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ylittää maksimiboluksen" + "value" : "Ei lukemaa" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Dépasse le bolus maximal" + "value" : "Aucune mesure" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Exceeds Maximum Bolus" + "value" : "אין קריאה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs érték" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Supera il bolo massimo" + "value" : "Nessuna lettura" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ボーラス最大値を超えています" + "value" : "測定値なし" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Overskrider maksimal bolus" + "value" : "Ingen måling" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Overschrijdt maximale bolus" + "value" : "Geen waarde" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Osiągnięto bolus maksymalny" + "value" : "Brak odczytu" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Excede o Bolus Máximo" + "value" : "Sem leitura" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Depășește bolusul maxim" + "value" : "Nicio citire" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Превышает максимальный болюс" + "value" : "Нет показаний" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadna hodnota" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Överstiger maxbolusdos" + "value" : "Inget värde" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Maksimum Bolusu Aşıyor" + "value" : "Okuma yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає показників" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Vượt quá liều Bolus tối đa" + "value" : "Không có chỉ số" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "超过大剂量上限" + "value" : "无读数" } } } }, - "Exercise is a common reason to use a preset. Different kinds of exercise and their intensity levels can affect your glucose levels in different ways." : { - - }, - "Explosive sprints or bursts" : { - - }, - "Export Critical Event Logs" : { - "comment" : "The title of the export critical event logs in support", - "extractionState" : "stale", + "Not enough days for a pattern: %1$@ of 5" : { + "comment" : "Trends Daily pattern footnote when fewer than 5 days have readings; the chart shows raw readings instead. (1: days with readings)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "أيام غير كافية لنمط: %1$@ من 5" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Málo dní pro profil: %1$@ z 5" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Eksportér kritisk begivenhedslog" + "value" : "Ikke nok dage til et mønster: %1$@ af 5" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Protokolle kritischer Ereignisse exportieren" + "value" : "Nicht genug Tage für ein Profil: %1$@ von 5" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Exportar registros de eventos críticos" + "value" : "No hay suficientes días para un patrón: %1$@ de 5" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Vie tärkeiden tapahtumien loki" + "value" : "Liian vähän päiviä profiiliin: %1$@ / 5" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Exporter les journaux d'événements critiques" + "value" : "Pas assez de jours pour un profil : %1$@ sur 5" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין מספיק ימים לדפוס: %1$@ מתוך 5" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs elég nap a mintázathoz: %1$@ / 5" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Esporta registri eventi critici" + "value" : "Giorni insufficienti per un andamento: %1$@ su 5" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "パターン作成には日数不足:%1$@ / 5日" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Eksporter kritiske hendelseslogger" + "value" : "Ikke nok dager for et mønster: %1$@ av 5" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Exporteer kritieke gebeurtenislogboek" + "value" : "Niet genoeg dagen voor een patroon: %1$@ van 5" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Eksportuj dzienniki zdarzeń krytycznych" + "value" : "Za mało dni na profil: %1$@ z 5" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dias insuficientes para um padrão: %1$@ de 5" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Exportați jurnalul de evenimente critice" + "value" : "Prea puține zile pentru un tipar: %1$@ din 5" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Экспорт логов критических событий" + "value" : "Мало дней для профиля: %1$@ из 5" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Málo dní pre profil: %1$@ z 5" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Exportera kritiska händelseloggar" + "value" : "För få dagar för ett mönster: %1$@ av 5" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kritik Olay Günlüklerini Dışa Aktarma" + "value" : "Örüntü için yeterli gün yok: %1$@ / 5" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Замало днів для профілю: %1$@ з 5" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không đủ ngày để tạo mẫu: %1$@ / 5" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "导出关键事件日志" + "value" : "天数不足以生成模式:%1$@ / 5" } } } }, - "Export-%1$@" : { - "comment" : "The export file name formatted string (1: timestamp)", + "Nothing logged" : { + "comment" : "Logbook day with no entries", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Eksport-%1$@" + "value" : "لا شيء مسجَّل" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Export-%1$@" + "value" : "Nic zaznamenáno" } }, - "es" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Exportar- %1$@" + "value" : "Intet registreret" } }, - "fi" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Vienti-%1$@" + "value" : "Nichts eingetragen" } }, - "fr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Export-%1$@" + "value" : "Nada registrado" } }, - "it" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Esporta- %1$@" + "value" : "Ei kirjauksia" } }, - "nb" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Eksporter- %1$@" + "value" : "Aucune saisie" } }, - "nl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Exporteren: %1$@" + "value" : "לא נרשם דבר" } }, - "pl" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Eksportuj- %1$@" + "value" : "Nincs bejegyzés" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Exportați-%1$@" + "value" : "Nessuna registrazione" } }, - "ru" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Экспорт -%1$@" + "value" : "記録なし" } }, - "sv" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Exportera-%1$@" + "value" : "Ingenting registrert" } }, - "tr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Dışa Aktar- %1$@" + "value" : "Niets vastgelegd" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "导出-%1$@" - } - } - } - }, - "External Insulin" : { - "comment" : "Dose type label for a manually-entered bolus" - }, - "Failed to Resume Insulin Delivery" : { - "comment" : "The alert title for a resume error", - "localizations" : { - "da" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Kunne ikke genoptage insulintilførsel" + "value" : "Brak wpisów" } }, - "de" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Wiederaufnahme der Insulinabgabe fehlgeschlagen" + "value" : "Nada registrado" } }, - "es" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "No se pudo reanudar la administración de insulina" + "value" : "Nimic înregistrat" } }, - "fi" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Annostelun jatkaminen epäonnistui" + "value" : "Нет записей" } }, - "fr" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Échec de la reprise de l’administration d’insuline" + "value" : "Nič zaznamenané" } }, - "it" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Impossibile riprendere l'erogazione dell'insulina" + "value" : "Inget loggat" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kunne ikke gjenoppta insulinlevering" + "value" : "Kayıt yok" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinetoediening hervatten mislukt" + "value" : "Немає записів" } }, - "pl" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Nie udało się wznowić podawania insuliny" + "value" : "Không có ghi chép" } }, - "ro" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Eșec la reluarea administrării de insulină" + "value" : "无记录" } - }, - "ru" : { + } + } + }, + "Nothing logged in the last 7 days." : { + "comment" : "Logbook empty state when there are no entries at all", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Не удалось возобновить подачу инсулина" + "value" : "لا شيء مسجَّل في آخر 7 أيام." } }, - "sk" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Obnovenie podávania inzulínu zlyhalo" + "value" : "Za posledních 7 dní nic zaznamenáno." } }, - "sv" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Misslyckades att återuppta insulintillförsel" + "value" : "Intet registreret de seneste 7 dage." } }, - "tr" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "İnsülin İletimine Devam Edilemedi" + "value" : "In den letzten 7 Tagen nichts eingetragen." } }, - "zh-Hans" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "恢复胰岛素输注失败" + "value" : "Nada registrado en los últimos 7 días." } - } - } - }, - "Falling / Falling Quickly" : { - - }, - "Falling Slowly" : { - - }, - "FAQ about Alerts" : { - "comment" : "View title for how mute alerts work" - }, - "Favorite Food Insights" : { - - }, - "Favorite Foods" : { - "comment" : "Label for Favorite Foods icon in Settings\nTitle for Favorite Foods view", - "localizations" : { - "de" : { + }, + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Lieblingsessen" + "value" : "Ei kirjauksia viimeisen 7 päivän aikana." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Aliments favoris" + "value" : "Aucune saisie ces 7 derniers jours." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מאכלים אהובים" + "value" : "לא נרשם דבר ב-7 הימים האחרונים." } }, - "nb" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Favorittmat" + "value" : "Nincs bejegyzés az elmúlt 7 napban." } }, - "nl" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Favoriete voedingsmiddelen" + "value" : "Nessuna registrazione negli ultimi 7 giorni." } }, - "ro" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Mâncăruri preferate" + "value" : "過去7日間の記録はありません。" } }, - "zh-Hans" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "食物库" + "value" : "Ingenting registrert de siste 7 dagene." } - } - } - }, - "FAVORITE FOODS" : { - "comment" : "The section title for Carb entry screen where Favorite Foods can be selected", - "localizations" : { - "da" : { + }, + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "FAVORIT-MAD" + "value" : "Niets vastgelegd in de afgelopen 7 dagen." } }, - "de" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Favorisiertes Essen" + "value" : "Brak wpisów z ostatnich 7 dni." } }, - "fr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "ALIMENTS FAVORIS" + "value" : "Nada registrado nos últimos 7 dias." } }, - "he" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "מאכלים אהובים" + "value" : "Nimic înregistrat în ultimele 7 zile." } }, - "it" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "CIBI SALVATI" + "value" : "Нет записей за последние 7 дней." } }, - "nb" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "FAVORITTMAT" + "value" : "Za posledných 7 dní nič zaznamenané." } }, - "nl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "FAVORIETE ETEN" + "value" : "Inget loggat de senaste 7 dagarna." } }, - "pl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "ULUBIONE JEDZENIE" + "value" : "Son 7 günde kayıt yok." } }, - "ro" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "MÂNCĂRURI PREFERATE" + "value" : "Немає записів за останні 7 днів." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không có ghi chép nào trong 7 ngày qua." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "食物库" + "value" : "过去 7 天没有记录。" } } } }, - "Fiasp" : { - "comment" : "Title of insulin model preset", - "extractionState" : "manual", + "Nothing to show for this filter" : { + "comment" : "Logbook day with no entries matching the selected filter", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "لا شيء لعرضه لهذا الفلتر" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Pro tento filtr nic k zobrazení" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Intet at vise for dette filter" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Keine Einträge für diesen Filter" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Nada que mostrar con este filtro" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Ei näytettävää tällä suodattimella" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Rien à afficher pour ce filtre" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "אין מה להציג עבור מסנן זה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nincs megjeleníthető elem ehhez a szűrőhöz" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Niente da mostrare per questo filtro" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "このフィルタに該当する項目はありません" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Ingenting å vise for dette filteret" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Niets te tonen voor dit filter" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Brak wpisów dla tego filtra" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Nada para mostrar neste filtro" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Nimic de afișat pentru acest filtru" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Нет записей для этого фильтра" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pre tento filter nič na zobrazenie" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Inget att visa för detta filter" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Bu filtre için gösterilecek bir şey yok" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Немає записів для цього фільтра" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Fiasp" + "value" : "Không có mục nào cho bộ lọc này" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "费雅普(Fiasp)" + "value" : "此筛选条件下没有内容" } } } }, - "Filter" : { - - }, - "Filtered by:" : { - - }, - "Fingerstick Glucose" : { - "comment" : "Label for manual glucose entry row on bolus screen", + "Now" : { + "comment" : "Title at the top of the Now screen, showing current glucose and Loop status Title of the Now tab in the redesigned interface, showing current glucose and Loop status", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الآن" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nyní" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Fingerprik blodsukker" + "value" : "Nu" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Blutzucker" + "value" : "Jetzt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa de punción en el dedo" + "value" : "Ahora" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Mitattu glukoosi" + "value" : "Nyt" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose capilaire" + "value" : "Maintenant" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "קריאת מד סוכר" + "value" : "עכשיו" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Most" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia capillare" + "value" : "Ora" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "現在" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkerverdi fra fingerstikk" + "value" : "Nå" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Vingerprikglucose" + "value" : "Nu" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoza z krwi" + "value" : "Teraz" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agora" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemie din deget" + "value" : "Acum" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Глюкоза по глюкометру" + "value" : "Сейчас" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Teraz" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kapillärt blodsocker" + "value" : "Nu" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Parmak Ucu KŞ" + "value" : "Şimdi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Зараз" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiện tại" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "指尖血糖" + "value" : "当前" } } } }, - "Fires once when Loop's forecast first dips below the level inside this horizon. Re-arms when the forecast clears." : { - "comment" : "A footer for the \"Horizon\" section of a glucose alert detail view, explaining how the horizon works.", - "isCommentAutoGenerated" : true - }, - "Fix now by turning Critical Alerts and Time Sensitive Notifications ON." : { - "comment" : "Both Critical Alerts and Time Sensitive Notifications disabled banner body" - }, - "Fix now by turning Critical Alerts ON." : { - "comment" : "Critical alerts disabled banner body" - }, - "Fix now by turning Notifications and Critical Alerts ON." : { - "comment" : "Both Critical Alerts and Notifications disabled banner body" - }, - "Fix now by turning Notifications ON." : { - "comment" : "Notifications disabled banner body" - }, - "Fix now by turning Notifications, Critical Alerts and Time Sensitive Notifications ON." : { - "comment" : "Secondary text for alerts disabled warning, which appears on the main status screen.", - "extractionState" : "stale", + "now" : { + "comment" : "Prediction chart x-axis label marking the current time", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الآن" + } + }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Opravit nyní zapnutím Oznámení, Kritických upozornění a Časově citlivých oznámení." + "value" : "nyní" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Løs nu ved at slå meddelelser, kritiske advarsler og tidsfølsomme meddelelser TIL." + "value" : "nu" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Behebe dies jetzt, indem Du Benachrichtigungen, kritische Alarme und zeitkritische Benachrichtigungen einschaltest." + "value" : "jetzt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Soluciónalo ahora activando Notificaciones, Alertas Críticas y Notificaciones Sensibles al Tiempo." + "value" : "ahora" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "nyt" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Corrigez-le maintenant en activant les notifications, les alertes critiques et les notifications urgentes." + "value" : "maint." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "תקן כעת ע״י הפעלת התראות, התראות קריטיות והודעות רגישות לזמן" + "value" : "עכשיו" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "most" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Risolvilo ora attivando notifiche, avvisi critici e notifiche sensibili al tempo." + "value" : "ora" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "現在" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Fiks nå ved å slå PÅ varsler, kritiske varsler og tidssensitive varsler." + "value" : "nå" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Los nu op door Meldingen, Kritieke meldingen en Tijdgevoelige meldingen AAN te zetten." + "value" : "nu" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Napraw teraz, włączając powiadomienia, alerty krytyczne i powiadomienia zależne od czasu." + "value" : "teraz" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "agora" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Remediați acum activând Notificări, Alerte critice și Notificări urgente." + "value" : "acum" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Исправьте ситуацию, включив уведомления, критические оповещения и уведомления, чувствительные к времени." + "value" : "сейчас" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "teraz" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "nu" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bildirimleri, Kritik Uyarıları ve Zamana Duyarlı Bildirimleri AÇIK konuma getirerek şimdi düzeltin." + "value" : "şimdi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "зараз" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "bây giờ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "请立即开启“通知”、“重要警报”和“时效性通知”以解决问题。" + "value" : "现在" } } } }, - "Fix now by turning Time Sensitive Notifications ON." : { - "comment" : "Time sensitive notifications disabled banner body" - }, - "Food Type" : { - "comment" : "Label for food type entry on add favorite food screen", + "Open loop / manual" : { + "comment" : "Trends Loop status: time closed loop was switched off", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Food Type" + "value" : "حلقة مفتوحة / يدوي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otevřená smyčka / ručně" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Madtype" + "value" : "Åbent Loop / manuel" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Essenstyp" + "value" : "Open Loop / manuell" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Food Type" + "value" : "Circuito abierto / manual" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Food Type" + "value" : "Avoin säätö / manuaalinen" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Type d'aliment" + "value" : "Boucle ouverte / manuel" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "סוג מאכל" + "value" : "Open Loop / ידני" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nyitott hurok / kézi" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tipo cibo" + "value" : "Loop aperto / manuale" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "オープンループ/手動" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Type mat" + "value" : "Åpen Loop / manuell" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Type voeding" + "value" : "Open loop / handmatig" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Rodzaj żywności" + "value" : "Pętla otwarta / ręcznie" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Food Type" + "value" : "Ciclo aberto / manual" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Tip aliment" + "value" : "Buclă deschisă / manual" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Тип еды" + "value" : "Открытый цикл / вручную" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Typ jedla" + "value" : "Otvorená slučka / ručne" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Typ av mat" + "value" : "Öppen loop / manuell" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Food Type" + "value" : "Açık döngü / manuel" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Відкритий цикл / вручну" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Loại thực phẩm" + "value" : "Vòng lặp mở / thủ công" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "食物类型" + "value" : "开环 / 手动" } } } }, - "For %1$@" : { - "comment" : "The format string used to describe a finite workout targets duration", - "extractionState" : "stale", + "Open loop · %1$@" : { + "comment" : "Status pill on the Now screen: closed loop is off (Loop recommends only) and Loop last ran this long ago. (1: duration, e.g. 3m)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "لمدة %1$@" + "value" : "حلقة مفتوحة · %1$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otevřená smyčka · %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "I %1$@" + "value" : "Åbent Loop · %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Für %1$@" + "value" : "Open Loop · %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Por %1$@" + "value" : "Circuito abierto · %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ ajaksi" + "value" : "Avoin säätö · %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Pendant %1$@" + "value" : "Boucle ouverte · %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "For %1$@" + "value" : "Open Loop · %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nyitott hurok · %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Per %1$@" + "value" : "Loop aperto · %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@につき" + "value" : "オープンループ · %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "For %1$@" + "value" : "Åpen Loop · %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voor %1$@" + "value" : "Open loop · %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Do %1$@" + "value" : "Pętla otwarta · %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Por %1$@" + "value" : "Ciclo aberto · %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Pentru %1$@" + "value" : "Buclă deschisă · %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "В течение %1$@" + "value" : "Открытый цикл · %1$@" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otvorená slučka · %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "I %1$@" + "value" : "Öppen loop · %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ için" + "value" : "Açık döngü · %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Відкритий цикл · %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "For %1$@" + "value" : "Vòng lặp mở · %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "对于 %1$@" + "value" : "开环 · %1$@" } } } }, - "For activities that raise your risk of going low, you can set a higher temporary correction range." : { - - }, - "For mixed-intensity activity:" : { - - }, - "For safety purposes, you should allow Critical Alerts, Time Sensitive and Notification Permissions (non-critical alerts) on your device to continue using %1$@ and cannot turn off individual alarms." : { - "comment" : "Description text for silencing time sensitive and non-critical alerts (1: app name)", - "extractionState" : "stale", + "Open loop · not run yet" : { + "comment" : "Status pill on the Now screen: closed loop is off and Loop has never completed", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Af sikkerhedsmæssige årsager bør du tillade, at Kritiske advarsler, Tidsfølsomme og Meddelelser (ikke-kritiske advarsler) på din enhed fortsætter med at bruge %1$@ og ikke kan slå individuelle alarmer fra." + "value" : "حلقة مفتوحة · لم يعمل بعد" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Aus Sicherheitsgründen solltest Du kritische Warnungen, zeitkritische Warnungen und Benachrichtigungsberechtigungen (nicht kritische Warnungen) auf Deinem Gerät zulassen, um %1$@ weiterhin verwenden zu können." + "value" : "Otevřená smyčka · zatím neproběhla" } }, - "fr" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Pour des raisons de sécurité, vous devriez autoriser les alertes critiques, les alertes urgentes et les autorisations de notification (alertes non-critiques) sur votre appareil pour continuer à utiliser %1$@ si vous ne pouvez pas désactiver les alarmes individuelles." + "value" : "Åbent Loop · ikke kørt endnu" } }, - "it" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Per motivi di sicurezza, dovresti consentire gli avvisi critici, gli avvisi sensibili al tempo e le autorizzazioni di notifica (avvisi non critici) sul tuo dispositivo per continuare a utilizzare %1$@ e non puoi disattivare i singoli allarmi." + "value" : "Open Loop · noch nicht gelaufen" } }, - "nb" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Av sikkerhetshensyn bør du tillate at kritiske varsler, tidssensitive varsler og varslingstillatelser (ikke-kritiske varsler) på enheten din fortsetter å bruke %1$@ og ikke kan slå av individuelle alarmer." + "value" : "Circuito abierto · aún no se ha ejecutado" } }, - "nl" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Voor je veiligheid moet je Kritieke meldingen, Tijdgevoelige meldingen en Meldingen (niet-kritieke waarschuwingen) op je apparaat toestaan om %1$@ te blijven gebruiken. Je kunt afzonderlijke alarmen niet uitschakelen." + "value" : "Avoin säätö · ei vielä ajettu" } }, - "pl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ze względów bezpieczeństwa należy zezwolić na alerty krytyczne, alerty zależne od czasu i uprawnienia do powiadomień (alerty niekrytyczne) na swoim urządzeniu na dalsze korzystanie z %1$@ i nie można wyłączać poszczególnych alarmów." + "value" : "Boucle ouverte · pas encore exécuté" } }, - "ro" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "În scopuri de siguranță, trebuie să permiteți alertele critice, urgente și permisiunile de notificare (alerte necritice) pe dispozitivul dumneavoastră pentru a continua să utilizați %1$@ și nu puteți dezactiva alarmele individuale." + "value" : "Open Loop · טרם רץ" } }, - "ru" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "В целях безопасности вам следует разрешить критические оповещения, срочные оповещения и уведомления (некритические оповещения) на вашем устройстве, чтобы продолжить использовать %1$@ и не отключать отдельные тревоги." + "value" : "Nyitott hurok · még nem futott" } }, - "zh-Hans" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "出于安全考虑,您应允许设备上的“关键警报”、“时效性警报”和“通知权限”(非关键警报),以便继续使用 %1$@ ,且无法关闭单个警报。" + "value" : "Loop aperto · non ancora eseguito" } - } - } - }, - "For some people, routine chores and everyday activities can affect glucose levels similar to exercise." : { - - }, - "For these activities, consider setting your insulin needs to **less than 100%**." : { - - }, - "For these activities, consider setting your insulin needs to **more than 100%**." : { - - }, - "Forecasted blood glucose may still be higher than target range." : { - "localizations" : { - "da" : { + }, + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet blodsukker kan stadig være højere end målområdet." + "value" : "オープンループ · 未実行" } }, - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Der prognostizierte Blutzucker kann immer noch über dem Zielbereich liegen." + "value" : "Åpen Loop · ikke kjørt ennå" } }, - "es" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "La glucosa en sangre pronosticada aún puede estar por encima del rango objetivo." + "value" : "Open loop · nog niet gedraaid" } }, - "fr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Le taux de glucose sanguin prévu pourrait quand-même être plus élevé que la plage cible." + "value" : "Pętla otwarta · jeszcze nie działała" } }, - "he" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "רמת הסוכר הצפויה עשויה עדיין להיות גבוהה מטווח היעד." + "value" : "Ciclo aberto · ainda não executou" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "La glicemia prevista potrebbe essere più elevata di quella impostata come obiettivo." + "value" : "Buclă deschisă · nu a rulat încă" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet blodsukker kan fortsatt være høyere enn målområdet." + "value" : "Открытый цикл · ещё не запускался" } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Voorspelde bloedglucose kan nog steeds hoger zijn dan het streefbereik." + "value" : "Otvorená slučka · ešte neprebehla" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Prognozowany poziom glukozy we krwi może nadal być wyższy niż zakres docelowy." + "value" : "Öppen loop · inte körd än" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia prognozată poate fi în continuare mai mare decât intervalul țintă." + "value" : "Açık döngü · henüz çalışmadı" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Прогнозируемый уровень глюкозы в крови все еще может быть выше целевого диапазона." + "value" : "Відкритий цикл · ще не запускався" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Öngörülen KŞ, hala hedef aralıktan yüksek olabilir." + "value" : "Vòng lặp mở · chưa chạy" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "预测的血糖值可能仍高于目标范围。" + "value" : "开环 · 尚未运行" } } } }, - "Forecasted Glucose" : { - "comment" : "Title for forecast explanation modal on bolus view", + "Opens carb absorption" : { + "comment" : "VoiceOver hint for the COB tile on the Now screen", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet blodsukker" + "value" : "يفتح امتصاص الكارب" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Prognostizierte Blutzucker" + "value" : "Otevře vstřebávání sacharidů" } }, - "es" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa pronosticada" + "value" : "Åbner kulhydratoptagelse" } }, - "fr" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Glycémie prévue" + "value" : "Öffnet die KH-Aufnahme" } }, - "he" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "סוכר צפוי" + "value" : "Abre la absorción de carbohidratos" } }, - "it" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia prevista" + "value" : "Avaa hiilihydraattien imeytymisen" } }, - "nb" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet blodsukker" + "value" : "Ouvre l'absorption des glucides" } }, - "nl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Voorspelde glucose" + "value" : "פותח ספיגת פחמימות" } }, - "pl" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Prognozowana glukoza" + "value" : "Megnyitja a szénhidrát-felszívódást" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia prognozată" + "value" : "Apre l'assorbimento dei carboidrati" } }, - "ru" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Прогнозируемый уровень глюкозы" + "value" : "糖質吸収を開きます" } }, - "tr" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Tahmini KŞ" + "value" : "Åpner karbohydratabsorpsjon" } }, - "zh-Hans" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "预测血糖值" + "value" : "Opent koolhydraatopname" } - } - } - }, - "Frequently asked questions about alerts" : { - "comment" : "Label for link to see frequently asked questions", - "extractionState" : "stale", - "localizations" : { - "da" : { + }, + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Ofte stillede spørgsmål om påmindelser" + "value" : "Otwiera wchłanianie węglowodanów" } }, - "de" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Häufig gestellte Fragen zu Benachrichtigungen" + "value" : "Abre a absorção de carboidratos" } }, - "fr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Foire aux questions sur les alertes" + "value" : "Deschide absorbția carbohidraților" } }, - "it" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Domande frequenti sugli avvisi" + "value" : "Открывает усвоение углеводов" } }, - "nb" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Ofte stilte spørsmål om varsler" + "value" : "Otvorí vstrebávanie sacharidov" } }, - "nl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Veelgestelde vragen over waarschuwingen" + "value" : "Öppnar kolhydratabsorption" } }, - "pl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Często zadawane pytania dotyczące alertów" + "value" : "Karb emilimini açar" } }, - "ro" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Întrebări frecvente privind alertele" + "value" : "Відкриває засвоєння вуглеводів" } }, - "ru" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Часто задаваемые вопросы об оповещениях" + "value" : "Mở hấp thu Carbs" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "关于警报的常见问题" + "value" : "打开碳水吸收" } } } }, - "Full out effort. No conversation possible." : { - - }, - "g" : { - "comment" : "The short unit display string for grams", - "extractionState" : "stale", + "Opens CGM settings" : { + "comment" : "VoiceOver hint for the CGM status pill and CGM notice on the Now screen", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "يفتح إعدادات CGM" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otevře nastavení CGM" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Åbner CGM-indstillinger" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Öffnet die CGM-Einstellungen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Abre los ajustes del CGM" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Avaa CGM-asetukset" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Ouvre les paramètres du CGM" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "פותח הגדרות CGM" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Megnyitja a CGM beállításait" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Apre le impostazioni CGM" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "CGM設定を開きます" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Åpner CGM-innstillinger" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Opent CGM-instellingen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Otwiera ustawienia CGM" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Abre as configurações do CGM" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Deschide setările CGM" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "г" + "value" : "Открывает настройки CGM" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Otvorí nastavenia CGM" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Öppnar CGM-inställningar" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "gr" + "value" : "CGM ayarlarını açar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Відкриває налаштування CGM" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "g" + "value" : "Mở cài đặt CGM" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "克" + "value" : "打开 CGM 设置" } } } }, - "Get help with Alert Permissions" : { - "comment" : "Get help with Alert Permissions support button text", - "extractionState" : "stale", + "Opens insulin delivery history" : { + "comment" : "VoiceOver hint for the IOB tile on the Now screen", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يفتح سجل توصيل الأنسولين" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otevře historii podávání inzulínu" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Få hjælp til advarselstilladelser" + "value" : "Åbner historik for insulintilførsel" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Hol Dir Hilfe zu den Benachrichtigungsberechtigungen" + "value" : "Öffnet den Verlauf der Insulinabgabe" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ayuda con los Permisos de Alerta" + "value" : "Abre el historial de administración de insulina" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avaa insuliinin annosteluhistorian" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Obtenir de l'aide avec les autorisations d'alerte" + "value" : "Ouvre l'historique d'administration de l'insuline" } }, - "it" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Ottieni assistenza per le autorizzazioni" + "value" : "פותח היסטוריית מתן אינסולין" } }, - "nb" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Få hjelp med varslingsinnstillinger" + "value" : "Megnyitja az inzulinadagolási előzményeket" } }, - "nl" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Krijg hulp bij toestemming meldingen" + "value" : "Apre la cronologia di erogazione insulina" } }, - "pl" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Uzyskaj pomoc dotyczącą uprawnień alertów" + "value" : "インスリン注入履歴を開きます" } }, - "ro" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Obțineți ajutor cu permisiunile de alertă" + "value" : "Åpner historikk for insulinlevering" } }, - "ru" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Справка по разрешениям на оповещения" + "value" : "Opent geschiedenis van insulinetoediening" } }, - "tr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Uyarı İzinleri ile ilgili yardım alın" + "value" : "Otwiera historię podaży insuliny" } }, - "zh-Hans" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "获取有关警报权限的帮助" + "value" : "Abre o histórico de entrega de insulina" } - } - } - }, - "Get help with iOS Permissions" : { - "comment" : "Get help with iOS Permissions support button text" - }, - "Glucose" : { - "comment" : "Health access row label for glucose\nThe title of the glucose and prediction graph\nTitle for predicted glucose chart on bolus screen", - "localizations" : { - "ar" : { + }, + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "قراءات السكر" + "value" : "Deschide istoricul administrării insulinei" } }, - "cs" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Glukóza" + "value" : "Открывает историю подачи инсулина" } }, - "da" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Glukose" + "value" : "Otvorí históriu podávania inzulínu" } }, - "de" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Blutzucker" + "value" : "Öppnar historik för insulindosering" } }, - "es" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa" + "value" : "İnsülin iletim geçmişini açar" } }, - "fi" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoosi" + "value" : "Відкриває історію подачі інсуліну" } }, - "fr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Glycémie" + "value" : "Mở lịch sử tiêm insulin" } }, - "he" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose" + "value" : "打开胰岛素输注历史" + } + } + } + }, + "Opens Loop's prediction breakdown" : { + "comment" : "VoiceOver hint for the prediction card on the Now screen", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يفتح تفاصيل توقع Loop" } }, - "it" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia" + "value" : "Otevře rozpis predikce Loop" } }, - "ja" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "血糖値" + "value" : "Åbner opdelingen af Loops forudsigelse" } }, - "nb" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukker" + "value" : "Öffnet die Aufschlüsselung der Loop-Vorhersage" } }, - "nl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose" + "value" : "Abre el desglose de la predicción de Loop" } }, - "pl" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoza" + "value" : "Avaa Loopin ennusteen erittelyn" } }, - "pt-BR" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glicose" + "value" : "Ouvre le détail de la prédiction de Loop" } }, - "ro" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia" + "value" : "פותח פירוט תחזית Loop" } }, - "ru" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Глюкоза" + "value" : "Megnyitja a Loop előrejelzésének részleteit" } }, - "sk" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Glykémia" + "value" : "Apre il dettaglio della previsione di Loop" } }, - "sv" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Glukos" + "value" : "Loopの予測の内訳を開きます" } }, - "tr" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Kan şekeri" + "value" : "Åpner oppdelingen av Loops prognose" } }, - "vi" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Đường huyết" + "value" : "Opent de onderbouwing van de Loop-voorspelling" } }, - "zh-Hans" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "血糖" + "value" : "Otwiera szczegóły prognozy Loop" } - } - } - }, - "Glucose Alerts" : { - "comment" : "A link in the alert management screen that takes the user to the glucose alert settings view.", - "isCommentAutoGenerated" : true - }, - "Glucose Based Partial Application" : { - "comment" : "Title for glucose based partial application experiment description\nTitle of glucose based partial application experiment", - "localizations" : { - "da" : { + }, + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose Based Partial Application" + "value" : "Abre o detalhamento da previsão do Loop" } }, - "de" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Teilweise Anwendung auf Glukosebasis" + "value" : "Deschide detalierea predicției Loop" } }, - "fr" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Application partielle basée sur la glycémie" + "value" : "Открывает разбор прогноза Loop" } }, - "it" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Applicazione parziale basata sulla glicemia (GBPA)" + "value" : "Otvorí rozpis predikcie Loop" } }, - "nb" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Partiell anvendelse basert på glukosenivå" + "value" : "Öppnar detaljer om Loops prognos" } }, - "nl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose-afhankelijke gedeeltelijke toediening" + "value" : "Loop tahmin dökümünü açar" } }, - "pl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Algorytm adaptacyjny" + "value" : "Відкриває розбір прогнозу Loop" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Aplicare parțială pe bază de glicemie" + "value" : "Mở chi tiết dự đoán của Loop" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "基于血糖的部分输注" + "value" : "打开 Loop 预测明细" } } } }, - "Glucose Change Chart" : { - - }, - "Glucose data is %1$@ old" : { - "comment" : "The error message when glucose data is too old to be used. (1: glucose data age in minutes)", + "Opens pump settings" : { + "comment" : "VoiceOver hint for the pump status pill and pump notice on the Now screen", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "قراءات السكر منذ %1$@ " + "value" : "يفتح إعدادات المضخة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otevře nastavení pumpy" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkerdata er %1$@ gamle" + "value" : "Åbner pumpeindstillinger" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Blutzuckerdaten sind %1$@ alt" + "value" : "Öffnet die Pumpeneinstellungen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Los datos de glucosa son de hace %1$@ " + "value" : "Abre los ajustes de la microinfusadora" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoositieto on %1$@ vanha" + "value" : "Avaa pumpun asetukset" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Les dernières données de glucose remontent à %1$@" + "value" : "Ouvre les paramètres de la pompe" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose data is %1$@ old" + "value" : "פותח הגדרות משאבה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Megnyitja a pumpa beállításait" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "I dati sulla glicemia sono vecchi di %1$@" + "value" : "Apre le impostazioni della pompa" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "血糖データは %1$@ 前のものです" + "value" : "ポンプ設定を開きます" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkerdata er %1$@ gammel" + "value" : "Åpner pumpeinnstillinger" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosegegevens zijn %1$@ oud" + "value" : "Opent pompinstellingen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dane o glukozie są nieaktualne od %1$@" + "value" : "Otwiera ustawienia pompy" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Medida de glicose está %1$@ atrasada" + "value" : "Abre as configurações da bomba" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Datele despre glicemie au o vechime de %1$@" + "value" : "Deschide setările pompei" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Данные о глюкозе устарели на %1$@" + "value" : "Открывает настройки помпы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otvorí nastavenia pumpy" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Glukosvärde är %1$@ gammalt" + "value" : "Öppnar pumpinställningar" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ eski KŞ verisi" + "value" : "Pompa ayarlarını açar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Відкриває налаштування помпи" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Dữ liệu đường huyết %1$@ cũ" + "value" : "Mở cài đặt bơm" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "葡萄糖%1$@分钟未更新" + "value" : "打开胰岛素泵设置" } } } }, - "Glucose data not available" : { - "comment" : "Description of error when glucose data is missing", + "Opens the full day" : { + "comment" : "VoiceOver hint for the Today so far card on the Now screen", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "قراءات السكر غير متوفرة" + "value" : "يفتح اليوم كاملًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otevře celý den" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkerdata ikke tilgængelige" + "value" : "Åbner hele dagen" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Blutzuckerdaten nicht verfügbar" + "value" : "Öffnet den ganzen Tag" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Los datos de glucosa no están disponibles" + "value" : "Abre el día completo" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoositietoja ei saatavilla" + "value" : "Avaa koko päivän" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Les données de glucose ne sont pas disponibles" + "value" : "Ouvre la journée complète" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose data not available" + "value" : "פותח את היום המלא" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Megnyitja a teljes napot" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Dati sulla glicemia non disponibili" + "value" : "Apre il giorno completo" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "グルコースデータがありません" + "value" : "1日全体を開きます" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkerdata er utilgjengelig" + "value" : "Åpner hele dagen" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosegegevens niet beschikbaar" + "value" : "Opent de hele dag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dane o glukozie są niedostępne" + "value" : "Otwiera cały dzień" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Medida de glicose não disponível" + "value" : "Abre o dia completo" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nu sunt disponibile date despre glicemie" + "value" : "Deschide ziua completă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Данные гликемии недоступны" + "value" : "Открывает весь день" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otvorí celý deň" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Glukosvärde saknas" + "value" : "Öppnar hela dagen" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "KŞ verisi mevcut değil" + "value" : "Tüm günü açar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Відкриває весь день" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Dữ liệu đường huyết không sẵn sàng" + "value" : "Mở toàn bộ ngày" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "血糖数据不可用" + "value" : "打开全天视图" } } } }, - "Glucose Data Now Available" : { - "comment" : "Alert title when glucose data returns while on bolus screen", - "extractionState" : "stale", + "PDF report" : { + "comment" : "Trends export menu item: share a PDF report of the period", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkerdata er nu tilgængelige" + "value" : "تقرير PDF" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Blutzucker jetzt verfügbar" + "value" : "Zpráva PDF" } }, - "es" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Datos de glucosa ahora disponibles" + "value" : "PDF-rapport" } }, - "fi" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoositiedot nyt saatavilla" + "value" : "PDF-Bericht" } }, - "fr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Les données de glycémie sont maintenant disponibles" + "value" : "Informe PDF" } }, - "it" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Dati glicemia ora disponibili" + "value" : "PDF-raportti" } }, - "nb" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkerdata er utilgjengelig" + "value" : "Rapport PDF" } }, - "nl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosegegevens nu beschikbaar" + "value" : "דוח PDF" } }, - "pl" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Dane dotyczące glukozy są już dostępne" + "value" : "PDF-jelentés" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Valorile glicemiei sunt disponibile" + "value" : "Report PDF" } }, - "ru" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Данные о глюкозе теперь доступны" + "value" : "PDFレポート" } }, - "sv" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Blodglukosvärde finns nu tillgängligt" + "value" : "PDF-rapport" } }, - "tr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "KŞ Verileri Artık Kullanılabilir" + "value" : "PDF-rapport" } }, - "zh-Hans" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "现已获取血糖数据" + "value" : "Raport PDF" } - } - } - }, - "Glucose effect of suspending insulin delivery" : { - "comment" : "Description of the prediction input effect for suspension of insulin delivery", - "localizations" : { - "da" : { + }, + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoseeffekt ved afbrydelse af insulintilførsel" + "value" : "Relatório PDF" } }, - "de" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoseeffekt der Unterbrechung der Insulinabgabe" + "value" : "Raport PDF" } }, - "fr" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Effet sur la glycémie de la suspension d'administration de l'insuline" + "value" : "Отчёт PDF" } }, - "it" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Effetto sulla glicemia della sospensione dell'erogazione d'insulina" + "value" : "Správa PDF" } }, - "nb" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoseeffekt av å suspendere insulintilførsel" + "value" : "PDF-rapport" } }, - "nl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose-effect van onderbroken insulinetoediening" + "value" : "PDF raporu" } }, - "pl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Wpływ wstrzymania podawania insuliny na poziom glukozy" + "value" : "Звіт PDF" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Efectul asupra glicemiei al suspendării administrării de insulină" + "value" : "Báo cáo PDF" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "暂停胰岛素输注对血糖的影响" + "value" : "PDF 报告" } } } }, - "Glucose Entry Out of Range" : { - "comment" : "Alert title for a manual glucose entry out of range error\nTitle for bolus screen warning when glucose entry is out of range", + "per day, weekly average" : { + "comment" : "Trends Insulin per day card subtitle when each bar is a week's average daily total", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يوميًا، متوسط أسبوعي" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "za den, týdenní průměr" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkerværdi er uden for intervallet" + "value" : "pr. dag, ugegennemsnit" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Blutzucker-Eingabe außerhalb des Bereichs" + "value" : "pro Tag, Wochendurchschnitt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Entrada de glucosa fuera de rango" + "value" : "por día, promedio semanal" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoosiarvo alueen ulkopuolella" + "value" : "päivässä, viikkokeskiarvo" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "La glycémie saisie est hors de la plage." + "value" : "par jour, moyenne hebdomadaire" } }, - "it" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia inserita fuori intervallo" + "value" : "ליום, ממוצע שבועי" } }, - "nb" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkerdata er utenfor intervallet" + "value" : "naponta, heti átlag" } }, - "nl" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose-invoer buiten bereik" + "value" : "al giorno, media settimanale" } }, - "pl" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadzanie glukoza jest poza zakresem" + "value" : "1日あたり、週平均" } }, - "ro" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Valoarea glicemiei introdusă este în afara intervalului" + "value" : "per dag, ukesgjennomsnitt" } }, - "ru" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ввод глюкозы вне допустимого диапазона" + "value" : "per dag, weekgemiddelde" } }, - "sv" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Det manuellt inmatade blodsockervärdet utanför gränsvärden" + "value" : "dziennie, średnia tygodniowa" } }, - "tr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "KŞ Girişi Aralık Dışında" + "value" : "por dia, média semanal" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "输入血糖超出范围" - } - } - } - }, - "Glucose Metrics" : { - "comment" : "Glucose metrics section header" - }, - "Glucose Momentum" : { - "comment" : "Title of the prediction input effect for glucose momentum", - "localizations" : { - "ar" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "مقاومة سكر الدم" + "value" : "pe zi, medie săptămânală" } }, - "da" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Blodsukkermomentum" + "value" : "в день, среднее за неделю" } }, - "de" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Blutzucker-Momentum" + "value" : "za deň, týždenný priemer" } }, - "es" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Momento de Glucosa" + "value" : "per dag, veckomedel" } }, - "fi" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Glukoosin liike" + "value" : "günlük, haftalık ortalama" } }, - "fr" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Momentum de glucose" + "value" : "на день, середнє за тиждень" } }, - "he" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Glucose Momentum" + "value" : "mỗi ngày, trung bình theo tuần" } }, - "it" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Momento della glicemia" + "value" : "每日,按周平均" } - }, - "ja" : { + } + } + }, + "Pod changed" : { + "comment" : "Pump event in the history: the pump or pod was replaced", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "グルコース モメンタム" + "value" : "تم تغيير Pod" } }, - "nb" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Glukose Momentum" + "value" : "Pod vyměněn" } }, - "nl" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosetrendlijn" + "value" : "Pod skiftet" } }, - "pl" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Pęd glukozy" + "value" : "Pod gewechselt" } }, - "pt-BR" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Aceleração da Glicose" + "value" : "Pod cambiado" } }, - "ro" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Avânt glicemie" + "value" : "Pod vaihdettu" } }, - "ru" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Динамика гликемии" + "value" : "Pod changé" } }, - "sv" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Glukosförändring" + "value" : "ה-Pod הוחלף" } }, - "tr" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "KŞ Momentumu" + "value" : "Pod cserélve" } }, - "vi" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Chuyển động của Glucose" + "value" : "Pod cambiato" } }, - "zh-Hans" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "葡萄糖增量预测算法" + "value" : "Pod交換" } - } - } - }, - "Glucose overview and ambulatory glucose profile" : { - "comment" : "Statistics settings descriptive text" - }, - "Glucose Summary" : { - - }, - "Glucose Target Range Schedule" : { - "comment" : "Details for configuration error when glucose target range schedule is missing", - "localizations" : { - "da" : { + }, + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Tidsplan for glukosemålområde" + "value" : "Pod byttet" } }, - "de" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Zeitplan für den Blutzucker-Zielbereich" + "value" : "Pod vervangen" } }, - "es" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Horario para el objetivo de glucosa" + "value" : "Wymieniono poda" } }, - "fr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Horaire de la plage cible de glycémie" + "value" : "Pod trocado" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Programma di intervalli target di glicemia" + "value" : "Pod schimbat" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Tidsplan for blodsukker målområde" + "value" : "Под заменён" } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosestreefbereikschema" + "value" : "Pod vymenený" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Harmonogram zakresu docelowego glukozy" + "value" : "Pod bytt" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Programul intervalului țintă de glicemie" + "value" : "Pod değiştirildi" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "График целевого диапазона глюкозы" + "value" : "Под замінено" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "KŞ Hedef Aralığı Programı" + "value" : "Đã thay Pod" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "血糖目标范围表" + "value" : "已更换 Pod" } } } }, - "Glucose, Insulin, and Carb Data Access" : { - "comment" : "Apple Health settings descriptive text" - }, - "GMI" : { - "comment" : "Glucose Management Indicator metric title" - }, - "Go to Settings > Focus." : { - "comment" : "Focus modes step 1" - }, - "Goal: <%@" : { - "comment" : "Average glucose goal" - }, - "Goal: <1%" : { - "comment" : "TIR goal for very low" - }, - "Goal: <5%" : { - "comment" : "TIR goal for very high" - }, - "Goal: <7%" : { - "comment" : "GMI goal" - }, - "Goal: >70%" : { - "comment" : "CGM active goal\nTIR goal for target range" - }, - "Goal: ≤36%" : { - "comment" : "Glucose variability goal" - }, - "grams" : { - - }, - "HARDWARE SOUNDS" : { - "extractionState" : "stale", + "Pre-meal on" : { + "comment" : "Presets button title on the Now screen while the pre-meal target is on", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pre-Meal مفعّل" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Před jídlem zapnuto" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "HARDWARE-LYDE" + "value" : "Før-måltid til" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "HARDWARE-SOUNDS" + "value" : "Vor dem Essen an" } }, - "fr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "SONS MATÉRIELS" + "value" : "Pre-comida activado" } }, - "it" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "SUONI HARDWARE" + "value" : "Ennen ateriaa päällä" } }, - "nb" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "MASKINVARELYDER" + "value" : "Pré-repas activé" } }, - "nl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "GELUIDEN VAN APPARATUUR" + "value" : "Pre-Meal פעיל" } }, - "pl" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "DŹWIĘKI SPRZĘTOWE" + "value" : "Pre-Meal bekapcsolva" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "SUNETE HARDWARE" + "value" : "Pre-pasto attivo" } }, - "ru" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "АППАРАТНЫЕ ЗВУКИ" + "value" : "食前 オン" } }, - "zh-Hans" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "泵体提示音" + "value" : "Pre-måltid på" } - } - } - }, - "Her bolus recommendation is higher than usual because her overall insulin is set higher." : { - - }, - "Her preset is set to **110%%**, which is more than she usually needs. This means %@ will make her basal rates, carb ratio, and insulin sensitivity factor (ISF) stronger. " : { - - }, - "High" : { - "comment" : "Time-in-range band label (181–250 mg/dL)" - }, - "High Glucose" : { - "localizations" : { - "da" : { + }, + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Høj glukose" + "value" : "Voorafgaand aan maaltijd aan" } }, - "de" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Hoher Blutzucker" + "value" : "Przed posiłkiem wł." } }, - "fr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Glycémie élevée" + "value" : "Pré-refeição ligado" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia alta" + "value" : "Înainte de masă activ" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Høyt glukosenivå" + "value" : "До еды вкл." } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Hoge glucose" + "value" : "Pred jedlom zapnuté" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Wysoki poziom glukozy" + "value" : "Före måltid på" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemie ridicată" + "value" : "Yemek öncesi açık" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Высокий уровень глюкозы" + "value" : "Перед їжою увімк." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trước bữa ăn đang bật" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "高血糖" + "value" : "餐前已开启" } } } }, - "High Intensity (Anaerobic)" : { - - }, - "High-intensity exercise means pushing yourself to your **maximum effort**. It is so hard that talking is nearly impossible, and you can’t keep it up for very long." : { - - }, - "Hiking" : { - - }, - "Historical Data" : { - - }, - "Horizon" : { - "comment" : "A label for the \"Horizon\" setting in the glucose alert settings view.", - "isCommentAutoGenerated" : true - }, - "How can I silence non-Critical Alerts?" : { + "Predicted" : { + "comment" : "Prediction chart callout label for Loop's predicted glucose at the touched time", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "متوقع" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predikce" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Hvordan kan jeg slå ikke-kritiske alarmer fra?" + "value" : "Forudsagt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Wie kann ich nicht kritische Warnungen stummschalten?" + "value" : "Vorhergesagt" } }, - "fr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Comment puis-je faire taire les alertes auditives non-critiques?" + "value" : "Predicción" } }, - "it" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Come posso silenziare gli avvisi non critici?" + "value" : "Ennustettu" } }, - "nb" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Hvordan kan jeg dempe ikke-kritiske varsler?" + "value" : "Prédit" } }, - "nl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Hoe demp ik niet-kritieke waarschuwingen?" + "value" : "חזוי" } }, - "pl" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Jak mogę wyciszyć alerty niekrytyczne?" + "value" : "Előrejelzett" } }, - "ro" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Cum pot dezactiva sunetul alertelor non-critice?" + "value" : "Prevista" } }, - "ru" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Как отключить некритичные оповещения?" + "value" : "予測" } }, - "zh-Hans" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "如何关闭非关键警报?" + "value" : "Forventet" } - } - } - }, - "How can I silence only Time Sensitive and Non-Critical alerts?" : { - "extractionState" : "stale", - "localizations" : { - "da" : { + }, + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Hvordan kan jeg kun slå lyden fra for tidsfølsomme og ikke-kritiske advarsler?" + "value" : "Voorspeld" } }, - "de" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wie kann ich nur zeitkritische und nicht kritische Warnungen stummschalten?" + "value" : "Prognoza" } }, - "fr" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Comment puis-je faire taire uniquement les alertes urgentes et non-critiques?" + "value" : "Prevista" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Come posso silenziare solo gli avvisi sensibili al tempo e non critici?" + "value" : "Prezis" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Hvordan kan jeg deaktivere kun tidssensitive og ikke-kritiske varsler?" + "value" : "Прогноз" } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Hoe demp ik alleen tijdgevoelige en niet-kritieke waarschuwingen?" + "value" : "Predikcia" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Jak wyciszyć tylko alerty zależne od czasu i niekrytyczne?" + "value" : "Förutsagt" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Cum pot dezactiva sunetul doar alertelor urgente și non-critice?" + "value" : "Tahmin" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Как отключить только срочные и некритические предупреждения?" + "value" : "Прогноз" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dự đoán" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "如何仅屏蔽“时效性”和“非关键”警报?" + "value" : "预测" } } } }, - "How can I temporarily silence all %1$@ app sounds?" : { - "comment" : "Title text for temporarily silencing all sounds (1: app name)", + "Manual Dose: %1$@ %2$@" : { + "comment" : "Description of a bolus dose entry (1: value (? if no value) in bold, 2: unit)", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Hvordan kan jeg midlertidigt slå lyden fra for alle %1$@ applyde?" + "value" : "Manuel dosis: %1$@ %2$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Wie kann ich alle Töne der %1$@ App vorübergehend stummschalten?" + "value" : "Manuelle Dosis: %1$@ %2$@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dosis manual: %1$@ %2$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Comment puis-je désactiver temporairement tous les sons de l'application %1$@?" + "value" : "Dosage manuel : %1$@ %2$@" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כמות ידנית: %1$@ %2$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Come posso silenziare temporaneamente tutti i suoni dell'app %1$@ ?" + "value" : "Dose manuale: %1$@ %2$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Hvordan kan jeg midlertidig dempe alle %1$@-applydene?" + "value" : "Manuell dose: %1$@ %2$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Hoe demp ik tijdelijk alle geluiden van de %1$@-app?" + "value" : "Doseer handmatig: %1$@ %2$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Jak mogę tymczasowo wyciszyć wszystkie dźwięki aplikacji %1$@ ?" + "value" : "Dawka z pena: %1$@ %2$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Cum pot dezactiva temporar toate sunetele aplicației %1$@?" + "value" : "Doză manuală: %1$@ %2$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Как временно отключить все звуки приложения %1$@?" + "value" : "Ручная доза: %1$@ %2$@" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manuel Doz: %1$@ %2$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "如何暂时关闭 %1$@ 应用中的所有声音?" + "value" : "手动剂量: %1$@ %2$@" } } } }, - "How does her preset impact her bolus recommendation?" : { - - }, - "How to configure each setting" : { - + "Manual temporary basal in progress. Automatic dosing is disabled." : { + "comment" : "The error message displayed for LoopError.manualTempBasalRunning errors." }, - "How to update (LoopDocs)" : { - "comment" : "The title text for how to update", + "Maximum Basal Rate Per Hour" : { + "comment" : "Details for configuration error when maximum basal rate per hour is missing", "localizations" : { - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jak aktualizovat (LoopDocs)" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Sådan opdaterer du (LoopDocs)" + "value" : "Maksimal basalrate pr. time" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Wie man aktualisiert (LoopDocs)" + "value" : "Maximale Basalte pro Stunde" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Cómo actualizar (LoopDocs)" + "value" : "Tasa basal máxima por hora" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Comment mettre à jour (LoopDocs)" + "value" : "Débit Basal Maximum par heure" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "כיצד לעדכן (LoopDocs)" + "value" : "בזאלי מקסימלי לשעה" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Come Aggiornare (LoopDocs)" + "value" : "Velocità basale massima all'ora" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Hvordan oppdatere (LoopDocs)" + "value" : "Maksimal basaldose pr. time" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Hoe bij te werken (LoopDocs)" + "value" : "Maximale basaalstand per uur" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Jak zaktualizować (LoopDocs)" + "value" : "Maksymalna dawka podstawowa na godzinę" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Cum se actualizează (LoopDocs)" + "value" : "Rata bazală maximă pe oră" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Как обновить (LoopDocs)" + "value" : "Максимальная базальная скорость в час" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Nasıl güncellenir (LoopDocs)" + "value" : "Saat Başı Maksimum Bazal Oran" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "如何更新(LoopDocs)" + "value" : "每小时最大基础速率" } } } }, - "How to use Presets for everyday activities" : { - - }, - "How to use Presets for exercise" : { - - }, - "How to use Presets when you are sick" : { - - }, - "https://mysite.herokuapp.com" : { - "comment" : "The placeholder text for the nightscout site URL credential", - "extractionState" : "manual", + "Maximum Bolus" : { + "comment" : "Details for configuration error when maximum bolus is missing", "localizations" : { - "en" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "https://mysite.herokuapp.com" + "value" : "Maksimal bolus" } - } - } - }, - "I'm a tester" : { - "comment" : "Button that dismisses the development build warning", - "localizations" : { + }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ich bin ein Tester" + "value" : "Maximaler Bolus" } }, - "fr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Je suis un testeur" + "value" : "Bolo Máximo" } }, - "nb" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Jeg er en tester" + "value" : "Suurin sallittu bolus" } }, - "nl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ik ben een tester" + "value" : "Bolus Maximum" } }, - "ro" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Sunt un tester" + "value" : "בולוס מקסימלי" } }, - "zh-Hans" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "我是一名测试员" + "value" : "Bolo massimo" } - } - } - }, - "if eating less than 2 hours before exercise" : { - - }, - "If glucose drops below 126 mg/dL" : { - - }, - "If iOS Focus Mode is ON and Mute Alerts is OFF, Critical Alerts will still be delivered and non-Critical Alerts will be silenced until %1$@ is added to each Focus mode as an Allowed App." : { - "comment" : "Focus modes descriptive text (1: app name)", - "extractionState" : "stale", - "localizations" : { - "da" : { + }, + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Hvis iOS-fokustilstand er slået TIL, og Slå lyden fra-advarsler er slået fra, leveres kritiske advarsler stadig, og ikke-kritiske advarsler slås fra, indtil %1$@ føjes til hver fokustilstand som en tilladt app." + "value" : "最大ボーラス" } }, - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Wenn der iOS-Fokusmodus aktiviert und die Stummschaltung von Warnungen deaktiviert ist, werden kritische Warnungen weiterhin übermittelt und nicht kritische Warnungen stummgeschaltet, bis %1$@ jedem Fokusmodus als zulässige App hinzugefügt wird." + "value" : "Maks bolus" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Si le mode Concentration d'iOS est activé et que les Alertes Muettes sont désactivées, les Alertes Critiques seront toujours livrées et les Alertes non Critiques seront silencieuses jusqu'à ce que %1$@ soit ajouté à chaque mode Concentration en tant qu'application autorisée." + "value" : "Maximale bolus" } }, - "it" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Se la modalità Focus iOS è attiva e Disattiva avvisi è disattivata, gli avvisi critici verranno comunque inviati e gli avvisi non critici verranno silenziati finché %1$@ non verrà aggiunto a ciascuna modalità Focus come app consentita." + "value" : "Maksymalny bolus" } }, - "nb" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Hvis iOS Focus Mode er PÅ og Mute Alerts er AV, vil kritiske varsler fortsatt bli levert og ikke-kritiske varsler vil bli dempet inntil %1$@ er lagt til i hver Focus Mode som en tillatt app." + "value" : "Bolus Máximo" } }, - "nl" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Als een iOS-focusmodus AAN staat en Waarschuwingen dempen UIT, worden Kritieke meldingen nog steeds afgeleverd. Niet-kritieke waarschuwingen blijven stil totdat %1$@ in elke focusmodus als toegestane app is toegevoegd." + "value" : "Bolus maxim" } }, - "pl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Jeśli tryb skupienia w systemie iOS jest włączony, a opcja Wycisz alerty jest wyłączona, alerty krytyczne będą nadal dostarczane, a alerty niekrytyczne będą wyciszane, dopóki %1$@ nie zostanie dodany do każdego trybu skupienia jako dozwolona aplikacja." + "value" : "Максимальный Болюс" } }, - "ro" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Dacă modul Focus iOS este ACTIVAT și opțiunea Dezactivare alerte este DEZACTIVATĂ, alertele critice vor fi transmise în continuare, iar alertele non-critice vor fi dezactivate până când %1$@ este adăugat la fiecare mod Focus ca aplicație permisă." + "value" : "Maximal bolus" } }, - "ru" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Если режим фокусировки iOS включен, а функция отключения оповещений выключена, критические оповещения будут по-прежнему доставляться, а некритические будут глушиться до тех пор, пока %1$@ не будет добавлен в каждый режим фокусировки в качестве разрешенного приложения." + "value" : "Maksimum Bolus" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Liều Bolus tối đa" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "如果 iOS 专注模式处于开启状态,且“静音提醒”处于关闭状态,则关键提醒仍会正常推送,而非关键提醒将被静音,直到将 %1$@ 添加到每个专注模式的“允许的应用”列表中为止。" + "value" : "最大剂量" } } } }, - "If you expect your glucose to rise during the activity, you may not need a preset." : { - - }, - "If you have active insulin in your body when you start exercising, you generally have an increased risk of low glucose." : { - - }, - "If you haven’t noticed a rise in glucose with high-intensity exercise, it may be due to:" : { - - }, - "If you often experience low glucose, you may need to reduce how much insulin you deliver for meals eaten 1-2 hours before exercising." : { - - }, - "If you usually experience lows while exercising, watch your glucose levels closely during exercise and consider eating around 3 to 20g of fast-acting carbs." : { - - }, - "If your activity has a higher risk of low glucose, start a physical activity preset at least **1 hour before you begin** and keep it on until you finish." : { - - }, - "If your glucose goes down, you may only need a small decrease in insulin — less than you would for low to moderate-intensity activity." : { - - }, - "If your glucose goes up, you may only need a small increase in insulin — less than you would for high-intensity activity." : { - - }, - "If your glucose isn't dropping, eating too many carbs can raise your blood sugar, trigger more insulin, and increase the risk of low blood sugar during or after the activity." : { - - }, - "Immediate" : { - "comment" : "Immediate Delivery status text", + "Maximum Bolus Exceeded" : { + "comment" : "Title for bolus screen warning when max bolus is exceeded", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Akut" + "value" : "Maksimal bolus overskredet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Sofort" + "value" : "Maximaler Bolus überschritten" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Inmediato" + "value" : "Bolo máximo excedido" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Immédiat" + "value" : "Bolus Maximum atteint" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "חריגה מבולוס מקסימלי" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Immediato" + "value" : "Bolo massimo superato" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Umiddelbar" + "value" : "Maksimal bolus overskredet" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Onmiddellijk" + "value" : "Maximale bolus overschreden" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Natychmiastowy" + "value" : "Przekroczono maksymalny bolus" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Imediat" + "value" : "Bolusul maxim depășit" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Немедленно" + "value" : "Превышен максимальный объем болюса" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Acilen" + "value" : "Maksimum Bolus Aşıldı" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "实时" + "value" : "超过最大推注量" } } } }, - "In future versions of Loop these experiments may change, end up as standard parts of the Loop Algorithm, or be removed from Loop entirely. Please follow along in the Loop Zulip chat to stay informed of possible changes to these features." : { - "comment" : "Algorithm Experiments description second paragraph.", + "Maximum Intensity (Anaerobic)" : { + + }, + "May experience a rise in glucose." : { + + }, + "May experience drops in glucose." : { + + }, + "Meal Bolus" : { + "comment" : "Title for bolus entry screen when also entering carbs", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "I fremtidige versioner af Loop kan disse eksperimenter ændre sig, ende som standarddele af Loop-algoritmen eller blive fjernet helt fra Loop. Følg med i Loop Zulip-chatten for at holde dig informeret om mulige ændringer af disse funktioner." + "value" : "Måltidsbolus" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mahlzeiten Bolus" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolo de Comida" } }, - "de" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "In zukünftigen Versionen von Loop können sich diese Experimente ändern, als Standardbestandteile des Loop-Algorithmus enden oder vollständig aus Loop entfernt werden. Bitte folgen Sie dem Loop Zulip-Chat, um über mögliche Änderungen dieser Funktionen auf dem Laufenden zu bleiben." + "value" : "Ateriabolus" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Dans les futures versions de Loop, ces essais peuvent changer, devenir des parties standard de l'algorithme Loop, ou être complètement retirées de Loop. Veuillez suivre le chat Zulip de Loop pour rester informé des éventuels changements sur ces fonctionnalités." + "value" : "Bolus de repas" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בולוס לכיסוי ארוחה" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nelle versioni future di Loop questi esperimenti potrebbero cambiare, diventare parti standard dell'algoritmo Loop o essere rimossi completamente da Loop. Segui la chat di Loop Zulip per rimanere informato su possibili modifiche a queste funzionalità." + "value" : "Bolo pasto" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "I fremtidige versjoner av Loop kan disse eksperimentene endres, ende opp som standarddeler av Loop-algoritmen eller fjernes helt fra Loop. Følg med i Loop Zulip-chatten for å holde deg informert om eventuelle endringer i disse funksjonene." + "value" : "Måltidsbolus" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "In toekomstige versies van Loop kunnen deze experimenten veranderen, een vast onderdeel van het Loop-algoritme worden of helemaal uit Loop verdwijnen. Volg de Loop Zulip-chat om op de hoogte te blijven van mogelijke wijzigingen aan deze functies." + "value" : "Maaltijd bolus" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "W przyszłych wersjach Loop te eksperymenty mogą się zmienić, stać się standardowymi częściami algorytmu Loop lub zostać całkowicie usunięte z Loop. Śledź czat Loop Zulip, aby być na bieżąco z możliwymi zmianami w tych funkcjach." + "value" : "Bolus Posiłkowy" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "În versiunile viitoare ale Loop, aceste experimente se pot schimba, pot deveni părți standard ale algoritmului Loop sau pot fi eliminate complet din Loop. Vă rugăm să urmăriți mesageria Loop Zulip pentru a fi la curent cu posibilele modificări ale acestor funcții." + "value" : "Bolus pentru masă" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Болюс на еду" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Måltidsbolus" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yemek Bolusu" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在 Loop 的未来版本中,这些实验性功能可能会发生变化,可能会成为 Loop 算法的标准组成部分,也可能会被完全移除。请关注 Loop 的 Zulip 聊天频道,以便及时了解这些功能可能发生的变化。" + "value" : "餐食大剂量" } } } }, - "In Range" : { - "comment" : "Time-in-range band label (70–180 mg/dL)" - }, - "Includes basal and automated boluses" : { + "Meal Summary" : { }, - "increase" : { + "Meal Timing" : { }, - "Increased Delivery" : { + "Median (line) with 25–75% and 5–95% bands, by time of day." : { + "comment" : "AGP chart explanation" + }, + "Medium Intensity (Aerobic)" : { }, - "Indefinitely" : { - "comment" : "The title of a target alert action specifying an indefinitely long workout targets duration", - "extractionState" : "manual", + "mg/dL" : { + "comment" : "The short unit display string for milligrams of glucose per decilter", + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "إلى أجل غير مسمى" + "value" : "mg/dL" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Uendelig" + "value" : "mg/dL" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Unbegrenzt" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Indefinitely" + "value" : "mg/dL" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Indefinidamente" + "value" : "mg/dL" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Toistaiseksi" + "value" : "mg/dL" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Indéfiniment" + "value" : "mg/dL" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Indefinitely" + "value" : "mg/dL" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Indefinitamente" + "value" : "mg/dL" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "無期限" + "value" : "mg/dL" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "På ubestemt tid" + "value" : "mg/dL" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voor onbepaalde tijd" + "value" : "mg/dL" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Niemożliwy do określenia" + "value" : "mg/dl" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Indefinidamente" + "value" : "mg/dL" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nedeterminat" + "value" : "mg/dL" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "На неопределенное время" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Oändligt" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Süresiz" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vô hạn định" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "永久" - } - } - } - }, - "Information" : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Information" + "value" : "мг/дл" } }, - "fr" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Information" + "value" : "mg/dL" } }, - "nb" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Informasjon" + "value" : "mg/dl" } }, - "nl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Informatie" + "value" : "mg/dL" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Informații" + "value" : "mg/dL" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "信息" + "value" : "mg/dL" } } } }, - "Insulin" : { - "comment" : "Health access row label for insulin\nTitle of the prediction input effect for insulin", + "Missed Meal Notifications" : { + "comment" : "Title for missed meal notifications toggle", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "الأنسولين" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin" + "value" : "Meddelelser om glemt måltid" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insulina" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insuliini" + "value" : "Verpasste Mahlzeit Benachrichtigung" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Insuline" + "value" : "Notifications de repas manqués" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin" + "value" : "התראה על ארוחות שלא הוזנו" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "インスリン" + "value" : "Notifiche di pasti mancati" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin" + "value" : "Varsler om tapte måltider" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insuline" + "value" : "Gemiste maaltijdmeldingen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insulina" + "value" : "Powiadomienia o pominiętych posiłkach" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Insulină" + "value" : "Notificări mese neanunțate" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Инсулин" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insulin" + "value" : "Уведомления о пропущенных приемах пищи" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İnsülin" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thuốc Insulin" + "value" : "Kaçırılan Yemek Bildirimleri" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素" + "value" : "错过用餐通知" } } } }, - "Insulin Absorbed (U) × Insulin Sensitivity (%1$@/U)" : { - "comment" : "Description of the prediction input effect for insulin", + "Missing data: %1$@" : { + "comment" : "The error message for missing data. (1: missing data details)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "الأنسولين الذي تم امتصاصه (وحدات) × حساسيو الأنسولين (%1$@/وحدة)" + "value" : "بيانات مفقودة: %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin absorberet (E) × Insulinfølsomhed (%1$@/E)" + "value" : "Manglende data: %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Resorbiertes Insulin (IE) × Insulinempfindlichkeit (%1$@/IE)" + "value" : "Fehlende Daten: %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina Absorbida (U) x Sensibilidad a Insulina (%1$@/U)" + "value" : "Faltan Datos: %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Imeytynyt insuliini (U) × Insuliiniherkkyys (%1$@/U)" + "value" : "Tiedot puuttuvat: %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Insuline Absorbée (U) × Sensibilité à l'Insuline (%1$@/U)" + "value" : "Données manquantes: %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin Absorbed (U) × Insulin Sensitivity (%1$@/U)" + "value" : "נתונים חסרים: %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina assorbita (U) × Sensibilità insulinica (%1$@/U)" + "value" : "Dati mancanti: %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "吸収済インスリン(U) × インスリン効果値(%1$@/U)" + "value" : "データがありません: %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin absorbert (E) × insulinfølsomhet ( %1$@ /E)" + "value" : "Manglende data: %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Opgenomen insuline (E) x insulinegevoeligheid (%1$@/E)" + "value" : "Ontbrekende gegevens: %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina podana (U) × czułość insuliny (%1$@/J)" + "value" : "Brakujące dane: %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina Absorvida (U) × Sensibilidade a Insulina (%1$@/U)" + "value" : "Dados ausentes: %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Insulină absorbită (U) × factor de sensibilitate la insulină (%1$@/U)" + "value" : "Date lipsă: %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Усвоенный инсулин (U) × Чувствительность к инсулину (%1$@/U)" + "value" : "Пропущены данные: %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin absorberat (E) × Insulinkänslighet (%1$@/E)" + "value" : "Saknar data: %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Emilen İnsulin (Ü) × İnsulin Duyarlılığı (%1$@/Ü)" + "value" : "Eksik veri: %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Lượng insulin tiêu hao (U) × Độ nhạy của insulin (%1$@/U)" + "value" : "Dữ liệu thiếu: %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "已吸收胰岛素×胰岛素敏感系数" + "value" : "数据缺失: %1$@" } } } }, - "Insulin adjustments have been disabled!" : { - "comment" : "Notification body for crash recovery alert", + "Missing maximum allowed bolus in settings" : { + "comment" : "Bolus error description: missing maximum bolus in settings.", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinjusteringer er blevet deaktiveret!" + "value" : "Manglende maksimalt tilladt bolus i indstillingerne" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Die Insulinanpassung wurde deaktiviert!" + "value" : "Maximal erlaubter Bolus in den Einstellungen fehlt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "¡Se han deshabilitado los ajustes de insulina!" + "value" : "Falta el bolo máximo permitido en la configuración" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Les ajustements d’insuline ont été désactivés!" + "value" : "Bolus maximal autorisé manquant dans les paramètres" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "בולוס מקסימלי חסר בהגדרות" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Le regolazioni dell'insulina sono state disattivate!" + "value" : "Manca il bolo massimo consentito nelle impostazioni" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinjusteringer er deaktivert!" + "value" : "Mangler maksimalt tillatt bolus i innstillingene" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulineaanpassingen zijn uitgeschakeld!" + "value" : "Maximaal toegestane bolus ontbreekt in instellingen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Korekty insuliny zostały wyłączone!" + "value" : "Brak ustawionego maksymalnego dozwolonego bolusa" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ajustările de insulină au fost dezactivate!" + "value" : "Lipsește bolusul maxim permis în setări" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Регулировка инсулина была отключена!" + "value" : "Отсутствие максимально допустимого болюса в настройках" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İnsülin ayarlamaları devre dışı bırakıldı!" + "value" : "Ayarlarda izin verilen maksimum bolus eksik" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素剂量调整功能已被禁用!" + "value" : "设置中缺少最大剂量限制" } } } }, - "Insulin Automation" : { - "comment" : "Closed loop settings button descriptive text" + "Mixed-intensity exercise may cause only small changes in glucose levels. Your glucose may go up or down." : { + }, - "Insulin Delivery" : { - "comment" : "The title of the insulin delivery graph", + "mmol/L" : { + "comment" : "The short unit display string for millimoles of glucose per liter", + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "توصيل الأنسولين" + "value" : "mmol/L" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulintilførsel" + "value" : "mmol/L" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinabgabe" + "value" : "mmol/L" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Administración de Insulina" + "value" : "mmol/L" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Insuliinin annostelu" + "value" : "mmol/L" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Administration de l'insuline" + "value" : "mmol/L" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin Delivery" + "value" : "mmol/L" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Erogazione insulina" + "value" : "mmol/L" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "インスリン放出" + "value" : "mmol/L" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinlevering" + "value" : "mmol/L" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinetoediening" + "value" : "mmol/L" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Podaż insuliny" + "value" : "mmol/L" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina Entregue" + "value" : "mmol/L" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Administrare insulină" + "value" : "mmol/L" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Подача инсулина" + "value" : "ммоль/л" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Podávanie inzulínu" + "value" : "mmol/L" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin doserat" + "value" : "mmol/L" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İnsulin İletimi" + "value" : "mmol/L" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Khối lượng tiêm insulin" + "value" : "mmol/L" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素输注" + "value" : "mmol/L" } } } }, - "Insulin Delivery Log" : { - - }, - "Insulin effects" : { - "comment" : "Details for missing data error when insulin effects are missing\nDetails for missing data error when insulin effects including pending insulin are missing", + "Mode" : { + "comment" : "Title for mode live activity toggle", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "تأثيرات الأنسولين" - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insulineffekter" - } - }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinwirkungen" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Efectos de la insulina" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insuliinivaikutus" + "value" : "Modus" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Effets de l'insuline" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insulin effects" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Effetto dell’insulina" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "インスリン効果" + "value" : "Mode" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin effekt" + "value" : "Modus" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulineëffecten" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "wpływ insuliny" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Efeitos da Insulina" + "value" : "Modus" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Efecte insulină" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Влияние инсулина" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insulineffekter" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "İnsülin etkileri" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tác dụng của insulin" + "value" : "Mod" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素效果" + "value" : "模式" } } } }, - "Insulin Event" : { - - }, - "Insulin Model" : { - "comment" : "Details for configuration error when insulin model is missing\n The title text for the insulin model setting row", - "extractionState" : "manual", + "Momentum effects" : { + "comment" : "Details for missing data error when momentum effects are missing", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "نوع الأنسولين" + "value" : "تأثيرات النشاط" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinmodel" + "value" : "Momentumeffekter" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin-Modell" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insulin Model" + "value" : "Momentum-Effekte" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Modelo de Insulina" + "value" : "Efectos de Momento" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Insuliinimalli" + "value" : "Liikevaikutukset (momentum)" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Modèle d'insuline" + "value" : "Effets de momentum" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin Model" + "value" : "השפעות מומנטום" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Modello di azione dell'Insulina" + "value" : "Effetti del momento" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "インスリンモデル" + "value" : "モメンタム効果" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin Modell" + "value" : "Momentum effekter" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinemodel" + "value" : "Trendlijneffecten" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Model insuliny" + "value" : "wpływ pędu" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Modelo de Insulina" + "value" : "Efeitos de aceleração" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Model insulină" + "value" : "Efecte avânt" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Модель инсулина" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inzulínový model" + "value" : "Влияние динамики СК" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinmodell" + "value" : "Momentumeffekter" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İnsülin Modeli" + "value" : "Momentum etkileri" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Chủng loại Insulin" + "value" : "Hiệu ứng động lượng" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素模型" + "value" : "葡萄糖动量效应" } } } }, - "Insulin Pump" : { - "comment" : "Descriptive text for Insulin Pump", + "Monitor your glucose and active insulin at the start of a competition day" : { + + }, + "More Info" : { + "comment" : "Text for more info action on notification of upcoming TestFlight expiration\nText for more info action on notification of upcoming profile expiration", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinpumpe" + "value" : "Mere Info" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinpumpe" + "value" : "Weitere Info" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Microinfusadora de insulina" + "value" : "Más Info" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Insuliinipumppu" + "value" : "Lisätietoa" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Pompe à insuline" + "value" : "Plus d'informations" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "משאבת אינסולין" + "value" : "מידע נוסף" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Pompa" + "value" : "Ulteriori informazioni" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "詳細" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinpumpe" + "value" : "Mer info" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinepomp" + "value" : "Meer informatie" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pompa insulinowa" + "value" : "Więcej informacji" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mais Info" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Pompa de insulină" + "value" : "Detalii" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Инсулиновая помпа" + "value" : "Доп. инфо" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinpump" + "value" : "Mer info" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İnsülin pompası" + "value" : "Daha fazla bilgi" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thêm thông tin" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素泵" + "value" : "更多信息" } } } }, - "Insulin Resumed" : { + "Morning Exercise" : { }, - "Insulin Sensitivities" : { - "comment" : "The title of the insulin sensitivities schedule screen\n The title text for the insulin sensitivity schedule", - "extractionState" : "manual", + "Morning exercise before eating (like a fasted jog) usually causes a smaller drop in glucose levels and may even promote a rise, compared to afternoon exercise." : { + + }, + "Mutable" : { + + }, + "Mute All Alerts" : { + "comment" : "Label for button to mute all alerts", + "extractionState" : "stale", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "حساسية الأنسولين" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinfølsomheder" + "value" : "Slå alle alarmer fra" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinempfindlichkeit" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insulin Sensitivities" + "value" : "Alle Alarme stummschalten" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Sensibilidad a la insulina" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insuliiniherkkyydet" + "value" : "Silenciar todas las alertas" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Facteurs de sensibilité à l'insuline" + "value" : "Enlever le son de toutes les alertes" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin Sensitivities" + "value" : "השתק את כל ההתראות" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Sensibilità insulinica" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "インスリン効果値" + "value" : "Disattiva tutti gli avvisi" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinfølsomhet" + "value" : "Demp alle varsler" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinegevoeligheden" + "value" : "Alle waarschuwingen dempen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wrażliwość na insulinę (ISF)" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sensibilidades a Insulina" + "value" : "Wycisz wszystkie alerty" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Factor de sensibilitate la insulină" + "value" : "Dezactivați toate alertele" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Факторы чувствительности инсулина" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insulinkänslighet" + "value" : "Выключить все оповещения" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İnsülin Duyarlılığı" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Độ nhạy của Insulin" + "value" : "Tüm Uyarıları Sessize Al" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素敏感系数" + "value" : "静音所有警报" } } } }, - "Insulin Sensitivity Factor (ISF)" : { - - }, - "Insulin Sensitivity Schedule" : { - "comment" : "Details for configuration error when insulin sensitivity schedule is missing", + "Mute All Alerts Temporarily" : { + "comment" : "Title for mute alert duration selection action sheet", + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinfølsomhed tidsplan" + "value" : "Slå lyden fra for alle advarsler midlertidigt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinempfindlichkeit Plan" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Horario de la sensibilidad a la insulina" + "value" : "Alle Warnungen vorübergehend stummschalten" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Horaire de facteur de sensibilité à l'insuline" + "value" : "Désactiver temporairement toutes les alertes" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Programma di sensibilità insulinica" + "value" : "Disattiva temporaneamente tutti gli avvisi" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin følsomhet tidsplan" + "value" : "Slå av alle varsler midlertidig" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinegevoeligheidschema" + "value" : "Alle waarschuwingen tijdelijk dempen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Harmonogram wrażliwości na insulinę" + "value" : "Tymczasowo wycisz wszystkie alerty" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Orarul Factorului de Sensibilitate la Insulină" + "value" : "Dezactivați temporar toate alertele" } }, - "ru" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "График чувствительности к инсулину" + "value" : "暂时静音所有警报" } - }, - "tr" : { + } + } + }, + "Mute All App Sounds" : { + "comment" : "Label for button to mute all app sounds" + }, + "Muted until" : { + "comment" : "Label for when mute alert will end" + }, + "Name" : { + "comment" : "Label for name row on add favorite food screen\nPreset sorting option description for sorting by name", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "İnsülin Duyarlılık Programı" + "value" : "الاسم" } }, - "zh-Hans" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素敏感系数(ISF)方案" + "value" : "Název" } - } - } - }, - "Insulin Suspended" : { - "comment" : "The title of the cell indicating the pump is suspended", - "localizations" : { + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulin suspenderet" + "value" : "Navn" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinabgabe unterbrochen" + "value" : "Name" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina Suspendida" + "value" : "Nombre" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Insuliini pysäytetty" + "value" : "Nimi" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Insuline suspendue" + "value" : "Nom" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "שם" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Insulina sospesa" + "value" : "Nome" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "プリセット名" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulintilførsel utsatt" + "value" : "Navn" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinetoediening onderbroken" + "value" : "Naam" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Podawanie Zawieszone" + "value" : "Nazwa" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nome" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Administrarea insulinei suspendată" + "value" : "Nume" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Подача инсулина приостановлена" + "value" : "Имя" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Názov" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Insulintillförsel pausad" + "value" : "Namn" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İnsülin Askıya Alındı" + "value" : "İsim" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tên" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素已暂停输注" + "value" : "名称" } } } }, - "Insulin Type" : { - "comment" : "Insulin type label", + "Needs Attention" : { + "comment" : "Sensor state description for the non-valid state", + "extractionState" : "manual", "localizations" : { - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Typ inzulínu" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Insulintype" + "value" : "Handling påkrævet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Insulintyp" + "value" : "Erfordert Aufmerksamkeit" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Tipo de Insulina" + "value" : "Necesita Atención" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Insuliinityyppi" + "value" : "Tarvitsee huomiota" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Type d'insuline" + "value" : "Demande votre attention" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "סוג האינסולין" + "value" : "דורש תשומת לב" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Tipo d'insulina" + "value" : "Richiede attenzione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "注意してください" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Insulintype" + "value" : "Trenger tilsyn" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Insulinetype" + "value" : "Aandacht nodig" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Rodzaj insuliny" + "value" : "Potrzebuje uwagi" } }, - "ro" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Tipul de insulină" + "value" : "Precisa de Atenção" } }, - "ru" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Тип инсулина" + "value" : "Necesită atenție" } }, - "sk" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Typ inzulínu" + "value" : "Требует внимания" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Insulintyp" + "value" : "Kräver uppmärksamhet" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İnsülin Tipi" + "value" : "İlgilenmeniz gerekiyor" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cần chú ý" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "胰岛素类型" + "value" : "请注意" } } } }, - "Integral Retrospective Correction" : { - "comment" : "Title for integral retrospective correction experiment description\nTitle of integral retrospective correction experiment", + "Negative duration not allowed" : { + "comment" : "Override error description: negative duration error.", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Integral Retrospective Correction" + "value" : "Negativ varighed ikke tilladt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Integrale retrospektive Korrektur" + "value" : "Eine negative Dauer ist nicht erlaubt" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Correction rétrospective intégrale" + "value" : "Durée négative non autorisée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "משך זמן שלילי לא מותר" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Correzione retrospettiva integrale (IRC)" + "value" : "Durata negativa non consentita" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Integrert retrospektiv korreksjon" + "value" : "Negativ varighet ikke tillatt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Integrale retrospectieve correctie" + "value" : "Negatieve duur niet toegestaan" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Integralna korekta retrospektywna" + "value" : "Ujemny czas trwania nie jest dozwolony" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Corecție retrospectivă integrală" + "value" : "Durata negativă nu este permisă" } }, - "zh-Hans" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "整体回顾性校正 (IRC)" + "value" : "Отрицательная продолжительность не допускается" } - } - } - }, - "Integral Retrospective Correction (IRC) is an extension of the standard Retrospective Correction (RC) algorithm component in Loop, which adjusts the forecast based on the history of discrepancies between predicted and actual glucose levels.\n\nIn contrast to RC, which looks at discrepancies over the last 30 minutes, with IRC, the history of discrepancies adds up over time. So continued positive discrepancies over time will result in increased dosing. If the discrepancies are negative over time, Loop will reduce dosing further." : { - "comment" : "Description of Integral Retrospective Correction toggle.", - "localizations" : { - "da" : { + }, + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Integral Retrospective Correction (IRC) er en udvidelse af standard Retrospective Correction (RC) algoritmekomponent i Loop, som justerer prognosen baseret på historikken med uoverensstemmelser mellem forudsagte og faktiske glukoseniveauer.\n\nI modsætning til RC, der ser på uoverensstemmelser i løbet af de sidste 30 minutter, med IRC, tilføjes historikken over uoverensstemmelser over tid. Så fortsatte positive uoverensstemmelser over tid vil resultere i øget dosering. Hvis uoverensstemmelserne er negative over tid, vil Loop reducere doseringen yderligere." + "value" : "Negatif süreye izin verilmez" } }, - "de" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Integral Retrospective Correction (IRC) ist eine Erweiterung der standardmäßigen Retrospective Correction (RC)-Algorithmuskomponente in Loop, die die Prognose basierend auf der Historie der Abweichungen zwischen vorhergesagten und tatsächlichen Glukosewerten anpasst. \n\nIm Gegensatz zu RC, das die Abweichungen der letzten 30 Minuten betrachtet, summiert sich bei IRC der Verlauf der Abweichungen im Laufe der Zeit. Daher führen anhaltende positive Abweichungen im Laufe der Zeit zu einer erhöhten Dosierung. Wenn die Abweichungen im Laufe der Zeit negativ sind, reduziert Loop die Dosierung weiter." + "value" : "不允许出现负时长" } - }, - "fr" : { + } + } + }, + "New Favorite Food" : { + "comment" : "Title of new favorite food screen", + "localizations" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "La correction rétrospective intégrale (IRC) est une extension de l'algorithme standard de correction rétrospective (RC) de Loop, qui ajuste les prévisions en fonction de l'historique des écarts entre les taux de glucose prévus et réels.\n\nContrairement à la correction correction rétrospective, qui prend en compte les écarts des 30 dernières minutes, la correction rétrospective intégrale (IRC) prend en compte l'historique des écarts au fil du temps. Ainsi, des écarts positifs continus au fil du temps entraîneront une augmentation du dosage. Si les écarts sont négatifs au fil du temps, Loop réduira encore le dosage." + "value" : "Neues Lieblingsessen" } }, - "it" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Correzione retrospettiva integrale (IRC) è un'estensione del componente standard dell'algoritmo di correzione retrospettiva (RC) in Loop, che regola la previsione in base alla cronologia delle discrepanze tra i livelli di glicemia previsti e quelli effettivi. \n\nA differenza di RC, che esamina le discrepanze negli ultimi 30 minuti, con IRC la cronologia delle discrepanze si accumula nel tempo. Pertanto, continue discrepanze positive nel tempo comporteranno un aumento del dosaggio. Se le discrepanze diventano negative nel tempo, Loop ridurrà ulteriormente il dosaggio." + "value" : "Nouvel aliment préféré" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Integral Retrospective Correction (IRC) er en utvidelse av standardalgoritmekomponenten Retrospective Correction (RC) i Loop, som justerer prognosen basert på historikken for avvik mellom forventede og faktiske glukosenivåer.\n\nI motsetning til RC, som ser på avvik i løpet av de siste 30 minuttene, summerer IRC avvikene over tid. Fortsatte positive avvik over tid vil derfor føre til økt dosering. Hvis avvikene er negative over tid, vil Loop redusere doseringen ytterligere." + "value" : "Ny favorittmat" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Integrale retrospectieve correctie (IRC) is een uitbreiding van het standaardonderdeel Retrospectieve correctie (RC) van het Loop-algoritme. RC past de voorspelling aan op basis van eerdere verschillen tussen voorspelde en werkelijke glucosewaarden.\n\nRC kijkt alleen naar verschillen in de laatste 30 minuten. Bij IRC tellen de verschillen in de loop van de tijd op. Blijven de verschillen langere tijd positief, dan doseert Loop meer. Zijn ze langere tijd negatief, dan doseert Loop nog minder." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Integralna korekta retrospektywna (IRC) jest rozszerzeniem standardowego komponentu algorytmu Korekta retrospektywna (RC) w Loop, który koryguje prognozę na podstawie historii rozbieżności między przewidywanymi a rzeczywistymi poziomami glukozy. \n\n W przeciwieństwie do RC, który analizuje rozbieżności w ciągu ostatnich 30 minut, w przypadku IRC historia rozbieżności sumuje się w czasie. Tak więc utrzymujące się dodatnie rozbieżności w czasie spowodują zwiększenie dawki. Jeśli rozbieżności są ujemne w czasie, Loop jeszcze bardziej zmniejszy podawanie insuliny." + "value" : "Nieuw favoriet voedingsmiddel" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Corecția Retrospectivă Integrală (CRI) este o extensie a componentei algoritmului standard de Corecție Retrospectivă (CR) din Loop, care ajustează prognoza pe baza istoricului discrepanțelor dintre nivelurile de glicemie prezise și cele reale. \n \nSpre deosebire de CR, care analizează discrepanțele din ultimele 30 de minute, cu CRI, istoricul discrepanțelor se adună în timp. Așadar, discrepanțele pozitive continue în timp vor duce la creșterea dozării. Dacă discrepanțele sunt negative în timp, Loop va reduce și mai mult dozarea." + "value" : "Noua mâncare preferată" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "整体回顾性校正(IRC)是Loop中标准回顾性校正(RC)算法组件的扩展,它根据预测血糖值与实际血糖值之间的历史偏差来调整预测值。\n\n与仅关注过去30分钟偏差情况的RC不同,IRC会随时间推移累积偏差历史数据。因此,若偏差值长期呈正值,剂量将相应增加;若偏差值长期呈负值,Loop则会进一步减少剂量。" + "value" : "新增常用食物" } } } }, - "Interrupted %1$@: %2$@ of %3$@ %4$@" : { - "comment" : "Description of an interrupted bolus dose entry (1: title for dose type, 2: value (? if no value) in bold, 3: programmed value (? if no value), 4: unit)", + "Next, we’ll look at settings you can change and how they affect Omar’s insulin." : { + + }, + "Next, we’ll look at settings you can change and how they affect Paloma’s insulin." : { + + }, + "Nightscout" : { + "comment" : "The title of the Nightscout service", + "extractionState" : "manual", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "نايتسكاوت" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nightscout" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Afbrudt %1$@: %2$@ af %3$@ %4$@" + "value" : "Nightscout" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ unterbrochen: %2$@ von %3$@ %4$@" + "value" : "Nightscout" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nightscout" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ interrumpido: %2$@ de %3$@ %4$@" + "value" : "Nightscout" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Keskeytetty %1$@: %2$@ / %3$@ %4$@" + "value" : "Nightscout" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Interrompu %1$@: %2$@ de %3$@ %4$@" + "value" : "Nightscout" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nightscout" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Interrotto %1$@: %2$@ di %3$@ %4$@" + "value" : "Nightscout" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nightscout" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Avbrutt %1$@: %2$@ av %3$@ %4$@" + "value" : "Nightscout" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Onderbroken %1$@: %2$@ van %3$@ %4$@" + "value" : "Nightscout" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przerwane %1$@ : %2$@ z %3$@ %4$@" + "value" : "Nightscout" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nightscout" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Întrerupere %1$@: %2$@ din %3$@ %4$@" + "value" : "Nightscout" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Прервано %1$@: %2$@ из %3$@ %4$@" + "value" : "Nightscout" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nightscout" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Avbruten %1$@: %2$@ av %3$@ %4$@" + "value" : "Nightscout" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ kesintiye uğradı: %3$@ %4$@'nın %2$@ 'si" + "value" : "Nightscout" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nightscout" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "中断的 %1$@:计划剂量:%3$@ %4$@, 实际剂量: %2$@" + "value" : "Nightscout" } } } }, - "Interval Training " : { + "No" : { }, - "Invalid absorption time: %1$@ hours" : { - "comment" : "Carb error description: invalid absorption time. (1: Input duration in hours).", + "No Activity" : { + + }, + "No alerts or alarms will sound while muted. Select how long you would you like to mute for." : { + "comment" : "Message for mute alert duration selection action sheet", + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig absorptionstid: %1$@ timer" + "value" : "Ingen advarsler eller alarmer lyder, mens lyden er slået fra. Vælg, hvor længe du vil slå lyden fra." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ungültige Resorptionszeit: %1$@ Stunden" + "value" : "Bei Stummschaltung ertönen keine Warn- oder Alarmsignale. Wähle die Dauer der Stummschaltung aus." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Temps d'absorption invalide : %1$@ heures" + "value" : "Aucune alerte ni alarme auditive ne sera émise lorsque le mode silencieux est activé. Choisissez la durée du mode silencieux." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Periodo di assorbimento non valido: %1$@ ore" + "value" : "Nessun avviso o allarme suonerà quando l'audio è disattivato. Seleziona per quanto tempo desideri disattivare l'audio." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig absorpsjonstid: %1$@ timer" + "value" : "Ingen varsler eller alarmer vil høres mens de er dempet. Velg hvor lenge du ønsker å dempe lyden." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ongeldige opnametijd: %1$@ uur" + "value" : "Zolang dempen aan staat, klinken er geen waarschuwingen of alarmen. Kies hoe lang je wilt dempen." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nieprawidłowy czas absorpcji: %1$@ godz" + "value" : "Po wyciszeniu nie będą emitowane żadne alerty ani alarmy. Wybierz, jak długo chcesz wyciszyć." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Timp de absorbție nevalid: %1$@ ore" + "value" : "Nicio alertă nu va suna când este dezactivat sunetul. Odată ce această perioadă se încheie, alertele și alarmele dumneavoastră vor relua normal." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无效的吸收时间:%1$@ 小时" + "value" : "静音期间所有提醒与告警都不会发出声音。请选择你希望保持静音的时长。" } } } }, - "Invalid Bolus Amount" : { - "comment" : "Bolus error description: invalid bolus amount.", + "No Bolus Recommended" : { + "comment" : "Title for bolus screen notice when no bolus is recommended\nTitle for bolus screen warning when glucose is below suspend threshold, and a bolus is not recommended\nTitle for bolus screen warning when no bolus is recommended", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig bolusmængde" + "value" : "Ingen bolus anbefalet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ungültige Bolusmenge" + "value" : "Kein Bolus empfohlen" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No hay bolo recomendado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bolusta ei suositella" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Quantité de bolus invalide" + "value" : "Aucun Bolus Recommandé" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "כמות בולוס לא תקינה" + "value" : "אין המלצה לבולוס" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Quantità bolo non valida" + "value" : "Nessun bolo consigliato" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig bolusmengde" + "value" : "Ingen anbefalt bolus" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ongeldige bolushoeveelheid" + "value" : "Geen bolus aanbevolen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nieprawidłowa wielkość bolusa" + "value" : "Bolus nie jest zalecany" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Cantitate invalidă de bolus" + "value" : "Niciun bolus recomandat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Неверный объем болюса" + "value" : "Нет рекомендации болюса" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen bolus rekommenderas" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Geçersiz Bolus Miktarı" + "value" : "Bolus Önerilmez" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "大剂量无效" + "value" : "没有推荐的餐前剂量" } } } }, - "Invalid carb amount" : { - "comment" : "Carb error description: invalid carb amount.", + "No change in glucose." : { + + }, + "no change needed" : { + + }, + "No connected devices, or failure during device connection" : { + "comment" : "The error message displayed for device connection errors.", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لا يوجد أجهزة متصلة, أو يوجد خطأ أثناء الاتصال" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig kulhydratmængde" + "value" : "Ingen tilsluttede enheder eller fejl under forbindelse til enhed" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ungültige Kohlenhydratmenge" + "value" : "Keine verbundenen Geräte oder Fehler während der Geräteverbindung" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Cantidad de carbohidratos no válida" + "value" : "No hay dispositivos conectados o falla durante conexión de dispositivo" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ei yhdistettyjä laitteita tai häiriö laiteyhteydessä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Quantité de glucides invalide" + "value" : "Pas d'appareil connecté, ou échec durant la connexion à l'appareil" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "כמות פחמימות לא תקינה" + "value" : "אין מכשירים מחוברים, או שישנה שגיאת התחברות." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Quantità di carboidrati non valida" + "value" : "Nessun dispositivo connesso o mancanza di segnale durante la connessione del dispositivo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "機器が未接続、または接続に問題" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig karbohydratmengde" + "value" : "Ingen tilkoblede enheter, eller feil under enhetstilkobling" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ongeldige hoeveelheid koolhydraten" + "value" : "Geen aangesloten apparaten of storingen tijdens het verbinden met het apparaat" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nieprawidłowa ilość węglowodanów" + "value" : "Brak podłączonych urządzeń lub awaria podczas połączenia urządzenia" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nenhum dispositivo conectado ou falha durante a conexão" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Cantitate de carbohidrați invalidă" + "value" : "Nu este conectat niciun dispozitiv sau s-a produs o eroare la conectare" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Неверное количество углеводов" + "value" : "Устройства не сопряжены или произошла ошибка во время сопряжения" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen ansluten enhet, eller fel vid anslutning till enhet" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Geçersiz karb miktarı" + "value" : "Bağlı cihaz yok veya cihaz bağlantısı sırasında hata" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không có thiết bị nào được kết nối, hoặc lỗi trong quá trình kết nối" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "碳水含量无效" + "value" : "没有连接的设备,或设备连接期间发生故障" } } } }, - "Invalid data: %1$@" : { - "comment" : "The error message when invalid data was encountered. (1: details of invalid data)", - "extractionState" : "manual", + "No Delivery" : { + + }, + "No glucose data for this period." : { + "comment" : "Statistics empty state" + }, + "No Maximum Bolus Configured" : { + "comment" : "Alert title for a missing maximum bolus setting error", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "بيانات غير صالحة: %1$@" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Fejlagtige data: %1$@" + "value" : "Ingen maksimal bolus konfigureret" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ungültige Daten: %1$@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Invalid data: %1$@" + "value" : "Kein maximaler Bolus konfiguriert" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Datos no válidos: %1$@" + "value" : "No hay bolo máximo configurado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Virheellinen tieto: %1$@" + "value" : "Maksimibolusta ei ole määritetty" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Données Incorrectes: %1$@" + "value" : "Aucun Bolus Maximum configuré" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Invalid data: %1$@" + "value" : "לא הוגדר בולוס מקסימלי" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Dati non validi: %1$@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "無効データ: %1$@" + "value" : "Nessun bolo massimo configurato" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldige data: %1$@" + "value" : "Ingen maksimal bolus er konfigurert" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ongeldige gegevens: %1$@" + "value" : "Geen maximale bolus geconfigureerd" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Błędne dane: %1$@" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dados inválidos: %1$@" + "value" : "Nie skonfigurowano maksymalnego bolusa" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Date invalide: %1$@" + "value" : "Bolusul maxim nu este setat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Неверные данные: %1$@" + "value" : "Не установлен максимальный болюс" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ogiltigt värde: %1$@" + "value" : "Ingen maximal bolus har blivit inställd" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Geçersiz veri: %1$@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dữ liệu vô hiệu: %1$@" + "value" : "Yapılandırılmış Maksimum Bolus Yok" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无效数据: %1$@" + "value" : "没有设置最大推注量" } } } }, - "Invalid Future Glucose" : { - "comment" : "Title for bolus screen notice when glucose data is in the future", + "No performance history available yet" : { + + }, + "No Pump Configured" : { + "comment" : "Alert title for a missing pump error", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig fremtidig glukose" + "value" : "Ingen pumpe konfigureret" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ungültige zukünftige Blutzuckerwerte" + "value" : "Keine Pumpe konfiguriert" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa futura no válida" + "value" : "No hay microinfusadora configurada" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumppua ei ole määritetty" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glycémie future invalide" + "value" : "Pas de pompe configurée" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "לא הוגדרה משאבה" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia futura non valida" + "value" : "Nessuna pompa configurata" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig fremtidig blodsukker" + "value" : "Ingen pumpe er konfigurert" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ongeldige toekomstige glucose" + "value" : "Geen pomp geconfigureerd" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przyszła glukoza nie jest znana" + "value" : "Nie skonfigurowano pompy" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemie Viitoare Invalidă" + "value" : "Nicio pompă configurată" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Недействительная будущая глюкоза" + "value" : "Нет настроенной помпы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen pump konfigurerad" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Geçersiz Gelecek Glikoz" + "value" : "Yapılandırılmış Pompa Yok" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无效的未来血糖值" + "value" : "未配置泵" } } } }, - "Invalid glucose reading with a timestamp that is %1$@ in the future" : { - "comment" : "The error message when glucose data is in the future. (1: glucose data time in future in minutes)", + "No Recent Glucose" : { + "comment" : "The title of the cell indicating that there is no recent glucose", + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig glukoseaflæsning med et tidsstempel, der er %1$@ i fremtiden" + "value" : "Ingen nyere glukose" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ungültiger Blutzuckermesswert mit einem Zeitstempel, der %1$@ in der Zukunft liegt" + "value" : "Kein aktueller Blutzucker " } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Lectura de glucosa no válida de %1$@ en el futuro" + "value" : "Sin glucosa reciente" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ei viimeaikaisia glukoositietoja" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Lecture de glucose non valide avec un horodatage situé à %1$@ dans le futur" + "value" : "Pas de Glycémie récente" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין גלוקוז לאחרונה" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Lettura della glicemia non valida con data e ora %1$@ nel futuro" + "value" : "Nessuna glicemia recente" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ugyldig blodsukkermåling med et tidsstempel som er %1$@ i fremtiden" + "value" : "Ingen ny blodsukkermåling" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ongeldige glucosemeting met een tijdstempel dat %1$@ in de toekomst ligt." + "value" : "Geen recente glucose" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nieprawidłowy odczyt glukozy ze znacznikiem czasu, który wynosi %1$@ w przyszłości" + "value" : "Brak aktualnej glukozy" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Citirea invalidă a glicemiei cu un marcaj temporal care este %1$@ în viitor" + "value" : "Lipsă glicemie recentă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Неверное показание глюкозы с временной меткой, которая находится на %1$@ в будущем" + "value" : "Нет актуальных данных о глюкозе" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inga senaste blodglukosvärde" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Gelecekte %1$@ olan bir zaman damgasıyla geçersiz KŞ okuması" + "value" : "Son KŞ Yok" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "血糖读数无效,其时间戳为 %1$@ ,该时间点在未来" + "value" : "无近期血糖数据" } } } }, - "iOS" : { - - }, - "iOS Critical Alerts and Time Sensitive Alerts are types of Apple notifications. They are used for high-priority events. Some examples include:" : { - "extractionState" : "stale", + "No Recent Glucose Data" : { + "comment" : "Title for bolus screen notice when glucose data is missing or stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Kritiske iOS-advarsler og tidsfølsomme advarsler er typer Apple-meddelelser. De bruges til begivenheder med høj prioritet. Nogle eksempler inkluderer:" + "value" : "Ingen nylige glukosedata" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kritische iOS-Warnungen und zeitkritische Warnungen sind Arten von Apple-Benachrichtigungen. Sie werden für Ereignisse mit hoher Priorität verwendet. Einige Beispiele:" + "value" : "Kein aktueller Blutzucker " + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sin datos de glucosa recientes" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ei viimeaikaisia glukoositietoja" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Les alertes critiques iOS et les alertes urgentes sont des types de notifications Apple. Elles sont utilisées pour des événements de haute priorité. Voici quelques exemples :" + "value" : "Pas de Glycémie récente" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין נתוני גלוקוז אחרונים" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "gli avvisi critici e gli avvisi sensibili al tempo di iOS sono tipi di notifiche Apple. Vengono utilizzati per eventi ad alta priorità. Alcuni esempi sono:" + "value" : "Nessun dato recente sulla glicemia" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "iOS Critical Alerts og Time Sensitive Alerts er typer Apple-varsler. De brukes ved hendelser med høy prioritet. Noen eksempler er:" + "value" : "Ingen nye blodsukkerdata" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Kritieke meldingen en Tijdgevoelige meldingen zijn soorten meldingen van Apple in iOS. Ze worden gebruikt voor belangrijke gebeurtenissen. Enkele voorbeelden:" + "value" : "Geen recente glucosegegevens" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Alerty krytyczne systemu iOS i alerty zależne od czasu to typy powiadomień Apple. Wykorzystuje się je do zdarzeń o wysokim priorytecie. Oto kilka przykładów:" + "value" : "Brak ostatnich danych dotyczących glukozy" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Alertele critice iOS și alertele urgente sunt tipuri de notificări Apple. Sunt folosite pentru evenimente cu prioritate ridicată. Câteva exemple includ:" + "value" : "Lipsă date recente glicemie" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Критические оповещения iOS и срочные оповещения — это типы уведомлений Apple. Они используются для проведения высокоприоритетных мероприятий. Вот некоторые примеры:" + "value" : "Нет актуальных данных о глюкозе" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inget aktuellt blodsockervärde" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Son KŞ Verisi Yok" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "iOS 严重告警与时效性告警是苹果系统的两类通知,用于高优先级事件。部分示例包括:" + "value" : "无近期血糖数据记录" } } } }, - "iOS Focus Modes" : { - "comment" : "View title for iOS focus modes\niOS focus modes navigation link label" - }, - "IOS FOCUS MODES" : { - "extractionState" : "stale", + "No Recent Pump Data" : { + "comment" : "Title for bolus screen notice when pump data is missing or stale", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "iOS-FOKUSTILSTANDE" + "value" : "Ingen nyere pumpedata" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "IOS-FOKUSMODI" + "value" : "Keine Pumpendaten" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sin datos de microinfusora recientes" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ei viimeaikaisia pumpun tietoja" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "MODES DE CONCENTRATION IOS" + "value" : "Aucune donnée de pompe récente" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "אין נתוני משאבה אחרונים" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "MODALITÀ FOCUS IOS" + "value" : "Nessun dato recente sulla pompa" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "IOS-FOKUSMODUSER" + "value" : "Mangler relevant pumpdata" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "FOCUSMODI VAN IOS" + "value" : "Geen recente pompgegevens" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "TRYBY SKUPIENIA IOS" + "value" : "Brak ostatnich danych pompy" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "MODURI CONCENTRARE IOS" + "value" : "Lipsă date recente pompă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "РЕЖИМЫ ФОКУСИРОВКИ IOS" + "value" : "Нет актуальных данных от помпы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det finns inga aktuella pumpdata" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Son Pompa Verisi Yok" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "iOS专注模式" + "value" : "没有最近的泵数据" } } } }, - "iOS Focus Modes enable you to have more control over when apps can send you notifications. If you decide to use these, ensure that notifications are allowed and NOT silenced from %1$@." : { - "comment" : "Description text for focus modes (1: app name)" - }, - "iOS has added features such as ‘Focus Mode’ that enable you to have more control over when apps can send you notifications.\n\nIf you wish to continue receiving important notifications from %1$@ while in a Focus Mode, you must ensure that notifications are allowed and NOT silenced from %1$@ for each Focus Mode." : { - "comment" : "Description text for iOS Focus Modes (1: app name) (2: app name)" - }, - "iOS Permissions" : { - "comment" : "Notification & Critical Alert Permissions screen title\niOS Permissions button text" - }, - "iOS Permissions and Mute All App Sounds" : { - "comment" : "Alert Permissions descriptive text" - }, - "ISF" : { - - }, - "Issue Report" : { - "comment" : "The title text for the issue report menu item\nThe view controller title for the issue report screen", - "extractionState" : "stale", + "No, edit amount" : { + "comment" : "The title of the action used when rejecting the the amount of carbohydrates entered.", "localizations" : { - "ar" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "تقرير المشكلة" + "value" : "Nej, indstil mængde" } }, - "da" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Fejlrapport" + "value" : "Nein, Menge bearbeiten" } }, - "de" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Problembericht" + "value" : "No, editar cantidad" } }, - "es" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Informe de Errores" + "value" : "Non, modifier la quantité" } }, - "fi" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Ongelmaraportti" + "value" : "לא, ערוך כמות" } }, - "fr" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Créer un rapport" + "value" : "No, modifica la quantità" } }, - "he" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Issue Report" + "value" : "Nei, rediger mengde" } }, - "it" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Report problemi" + "value" : "Nee, hoeveelheid aanpassen" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "問題を報告" + "value" : "Nie, edytuj ilość" } }, - "nb" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Problem Rapport" + "value" : "Nu, modificați cantitatea" } }, - "nl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Probleemrapportage" + "value" : "Нет, редактировать сумму" } }, - "pl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Zgłaszanie błędów" + "value" : "Hayır, miktarı düzenle" } }, - "pt-BR" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Gerar Relatório" + "value" : "不,修改含量" + } + } + } + }, + "None" : { + "comment" : "Indicates no favorite food is selected", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "None" } }, - "ro" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Generați raport" + "value" : "Žádný" } }, - "ru" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Сообщить об ошибке" + "value" : "Ingen" } }, - "sv" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Skapa felrapport" + "value" : "Keiner" } }, - "tr" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Sorun Raporu" + "value" : "Ninguno" } }, - "vi" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Xuất bản Báo cáo" + "value" : "Ei mitään" } }, - "zh-Hans" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "问题报告" + "value" : "Aucun" } - } - } - }, - "It looks like you may not have logged a meal you ate. Tap to log it now." : { - "comment" : "The notification description for a meal that was possibly not logged in Loop.", - "localizations" : { - "da" : { + }, + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Det ser ud til, at du måske ikke har indtastet et måltid, du har spist. Tryk for at logge det nu." + "value" : "None" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nessuno" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "なし" } }, - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Es sieht so aus, als ob du vergessen hast eine Mahlzeit einzugeben. Tippe um sie nun einzutragen." + "value" : "Ingen" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Il semble que vous n'ayez pas enregistré un repas que vous avez pris. Appuyez pour l'enregistrer maintenant." + "value" : "Geen" } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "ייתכן ולא הזנת ארוחה שאכלת. לחץ כדי להזין אותה כעת." + "value" : "Brak" } }, - "it" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Sembra che non sia stato registrato un pasto consumato. Tocca per registrarlo ora." + "value" : "Nenhum" } }, - "nb" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Det ser ut til at du kanskje ikke har logget et måltid du har spist. Trykk for å logge den nå." + "value" : "Nimic" } }, - "nl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Het lijkt erop dat je een maaltijd die je hebt gegeten niet hebt toegevoegd. Tik om het nu toe te voegen." + "value" : "Не подан" } }, - "pl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Wygląda na to, że nie wprowadziłeś zjedzonego posiłku. Stuknij, aby dodać zaległy posiłek." + "value" : "Žiadny" } }, - "ro" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Se pare că nu ați înregistrat o masă pe care ați mâncat-o. Atingeți pentru a o înregistra acum." + "value" : "Ingen" } }, - "ru" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Похоже, что Вы не ввели съеденную Вами еду. Нажмите , чтобы записать ее сейчас." + "value" : "Hiçbiri" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Görünüşe göre yediğiniz bir yemeği kaydetmemiş olabilirsiniz. Şimdi kaydetmek için dokunun." + "value" : "None" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "检测到你可能进食了但没有记录餐食。点击此处立即录入碳水。" + "value" : "无" } } } }, - "Jogging" : { + "None in last 24 hours" : { }, - "Keep All Notifications ON for %1$@" : { - "comment" : "Time sensitive notifications callout title (1: app name)" + "Not enough data to plot a profile." : { + "comment" : "AGP empty state" }, - "Keep your volume up" : { - "comment" : "Critical alert audio fallback callout title" + "Not Set" : { + "comment" : "Health sharing status: not determined" }, - "Large Meal Entered" : { - "comment" : "Title of the warning shown when a large meal was entered", + "Notification Delivery" : { + "comment" : "Notification Delivery Status text", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Stort måltid indtastet" + "value" : "Notifikationsindstillinger" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Große Mahlzeit eingegeben" + "value" : "Benachrichtigungszustellung" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Comida grande ingresada" + "value" : "Entrega de notificaciones" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Grand repas entré" + "value" : "Notification de l'administration" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "ארוחה גדולה נרשמה" + "value" : "משלוח הודעות" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Pasto abbondante inserito" + "value" : "Invio delle notifiche" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Angitt Stort Måltid" + "value" : "Varslingslevering" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Grote maaltijd ingevoerd" + "value" : "Afleveren meldingen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wprowadzono duży posiłek" + "value" : "Dostarczanie powiadomień" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "O cantitate mare de carbohidrați a fost introdusă" + "value" : "Livrare notificare" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Введена большая порция еды" + "value" : "Доставка уведомлений" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Büyük Yemek Girildi" + "value" : "Bildirim Gönderimi" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "已输入大份餐" + "value" : "通知推送类型" } } } }, - "Larger glucose drop" : { - - }, - "LAST 7 DAYS" : { - "comment" : "Preset Performance History, Last 7 days, Section title" - }, - "LAST 24 HOURS" : { - "comment" : "Preset Performance History, Last 24 hrs, Section title" - }, - "Last Auto Bolus" : { - - }, - "Last Bolus: " : { - - }, - "Last loop completed" : { - - }, - "Last Used" : { - "comment" : "Preset sorting option description for sorting by last used" - }, - "Later that day, Paloma eats a meal with about 30g of carbs." : { - - }, - "Launches CGM app" : { - "comment" : "Glucose HUD accessibility hint", - "extractionState" : "manual", + "Notification delivery is set to Scheduled Summary in your phone’s settings.\n\nTo avoid delay in receiving notifications from %1$@, we recommend notification delivery be set to Immediate Delivery." : { + "comment" : "Format for Critical Alerts permissions disabled alert body. (1: app name)", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "قم بتشغيل تطبيق نظام متابعة سكر الدم المستمرة" - } - }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Åbner CGM app’en" + "value" : "Notifikationer er indstillet til et Planlagt resumé i telefonens indstillinger.\n\nFor at undgå forsinkelser ved modtagelse af notifikarioner fra %1$@ anbefaler vi, at notifikationslevering er indstillet til øjeblikkelig levering." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Öffnet die CGM-App" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Launches CGM app" + "value" : "Die Benachrichtigungszustellung ist in den Einstellungen Deines Telefons auf geplante Zusammenfassung eingestellt.\n\nUm Verzögerungen beim Erhalt von Benachrichtigungen von %1$@ zu vermeiden, empfehlen wir, die Benachrichtigungszustellung auf sofortige Zustellung einzustellen." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Lanza app MCG" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Avaa CGM-sovelluksen" + "value" : "El envío de notificaciones está configurado como Resumen Programado en los ajustes del teléfono.\n\nPara evitar retrasos en la recepción de notificaciones de %1$@, le recomendamos que configure el envío de notificaciones como Entrega inmediata." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Lance l'application CGM" + "value" : "L'envoi des notifications est réglé sur \"Résumé programmé\" dans les paramètres de votre téléphone.\n\nPour éviter tout retard dans la réception des notifications de %1$@, nous vous recommandons de régler l'envoi des notifications sur \"Envoi immédiat\"." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מפעיל אפליקציית חיישן" + "value" : "משלוח התראות מוגדר לסיכום מתוזמן בהגדרות הטלפון שלך. \n\n כדי למנוע עיכוב בקבלת התראות מ- %1$@ , אנו ממליצים להגדיר את משלוח ההתראות למשלוח מיידי." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Avvia l'app CGM" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "CGMアプリを起動" + "value" : "L'invio delle notifiche è impostato su Riepilogo pianificato nelle impostazioni del telefono. \n\nPer evitare ritardi nella ricezione delle notifiche da %1$@ , ti consigliamo di impostare l'invio delle notifiche su Consegna immediata." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Laster inn CGM-appen" + "value" : "Varslingslevering er satt til Planlagt sammendrag i telefonens innstillinger. \n\n For å unngå forsinkelser i mottak av varsler fra %1$@ , anbefaler vi at varslingslevering settes til Umiddelbar levering." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Lanceert CGM app" + "value" : "De aflevering van meldingen in de instellingen van je telefoon staat op Gepland overzicht.\n\nOm vertraging bij het ontvangen van meldingen van %1$@ te voorkomen, raden we je aan om de aflevering van meldingen in te stellen op Onmiddellijk afleveren." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Uruchamia aplikację CGM" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inicia app CGM" + "value" : "Dostarczanie powiadomień jest ustawione na Zaplanowane podsumowanie w ustawieniach telefonu. \n\nAby uniknąć opóźnień w otrzymywaniu powiadomień od %1$@ , zalecamy ustawienie dostarczania powiadomień na Natychmiastowe dostarczanie." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Lansează aplicația senzorului de glicemie" + "value" : "Livrarea notificărilor este setată la Rezumat programat în setările telefonului dumneavoastră. \n\nPentru a evita întârzierea primirii notificărilor de la %1$@, vă recomandăm ca livrarea notificărilor să fie setată la Livrare imediată." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Запускает приложение непрерывного мониторинга CGM" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Startar CGM-app" + "value" : "В настройках телефона для доставки уведомлений установлено значение \"Сводка по расписанию\".\n\nЧтобы избежать задержки в получении уведомлений от %1$@, мы рекомендуем установить доставку уведомлений на Немедленную доставку." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "CGM uygulamasına erişim" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Phát hành ứng dụng CGM" + "value" : "Bildirim gönderimi, telefonunuzun ayarlarında Zamanlanmış Özet olarak ayarlanmıştır.\n\n%1$@ adresinden bildirim almakta gecikmeyi önlemek için bildirim gönderimini Anında Gönderim olarak ayarlanmasını öneririz." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "启动CGM软件" + "value" : "你的手机设置中,该 App 通知投递方式为定时推送摘要。\n\n为避免接收 %1$@ App 通知出现延迟,建议将通知投递方式改为立即推送。" } } } }, - "Learn More" : { - "comment" : "Learn more section header\nOK button title for alert shown when delivery status is uncertain", + "Notifications" : { + "comment" : "Notifications Status text", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Lær mere" + "value" : "Notifikationer" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Mehr erfahren" + "value" : "Benachrichtigungen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Más información" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lue lisää" + "value" : "Notificaciones" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "En savoir plus" + "value" : "Notifications" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מידע נוסף" + "value" : "התראות" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Ulteriori informazioni" + "value" : "Notifiche" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Lære mer" + "value" : "Varsler" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Meer informatie" + "value" : "Sta meldingen toe" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dowiedz się więcej" + "value" : "Powiadomienia" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Aflați mai multe" + "value" : "Notificări" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Подробнее" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lär dig mer" + "value" : "Уведомления" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Daha fazla bilgi edin" + "value" : "Bildirimler" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "了解更多" + "value" : "通知" } } } }, - "Learn more about Alerts" : { - "comment" : "Link to learn more about alerts" - }, - "Learning Hub" : { - - }, - "Less than a minute remaining" : { - "comment" : "Estimated remaining duration with less than a minute", + "Notifications Delayed" : { + "comment" : "Scheduled Delivery Enabled alert title", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Mindre end 1 minut tilbage" + "value" : "Notifikationer forsinkede" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Weniger als eine Minute verbleiben" + "value" : "Benachrichtigungsverzögerung" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Queda menos de un minuto" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle minuutti jäljellä" + "value" : "Retraso en las notificaciones" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Moins d'une minute restante" + "value" : "Notifications retardées" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "נותרה פחות מדקה" + "value" : "התראות מתעכבות" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Meno di un minuto rimanente" + "value" : "Notifiche ritardate" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Mindre enn et minutt gjenstår" + "value" : "Varsler forsinket" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Minder dan een minuut resterend" + "value" : "Meldingen vertraagd" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pozostało mniej niż minutę" + "value" : "Spóźnione Powiadomienia" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "A rămas mai puțin de un minut" + "value" : "Notificări întârziate" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Осталось меньше минуты" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mindre än en minut återstår" + "value" : "Уведомления временно отключены" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bir dakikadan az kaldı" + "value" : "Bildirimler Gecikti" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "剩余时间不足 1 分钟" + "value" : "通知延迟" } } } }, - "Let’s walk through a simple example to show how a preset might be used in this situation." : { - - }, - "Let’s walk through some examples to show how presets might be used in these situations." : { - - }, - "Light Intensity (Aerobic)" : { - - }, - "Light-to-moderate intensity exercise can cause a drop in glucose levels. This is because your body uses glucose (or sugar) for energy during physical activity." : { - - }, - "Live activity" : { - "comment" : "Live activity screen title", + "Notifications give you important %1$@ app information without requiring you to open the app." : { + "comment" : "Alert Permissions descriptive text (1: app name)", + "extractionState" : "stale", "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Live-Aktivität" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activité en direct" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Live activity" - } - }, - "nl" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Live activiteit" + "value" : "Meddelelser giver dig vigtige oplysninger om %1$@-appen uden at du behøver at åbne appen." } }, - "ro" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Activitate live" + "value" : "Benachrichtigungen geben Dir wichtige %1$@-App-Informationen, ohne dass Du die App öffnen musst." } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "实时活动" - } - } - } - }, - "Live Activity" : { - "comment" : "Live Activity settings button text" - }, - "Loading..." : { - "comment" : "The loading message for the diagnostic report screen", - "extractionState" : "stale", - "localizations" : { - "ar" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "تحميل..." + "value" : "Las notificaciones te proporcionan información importante sobre la aplicación %1$@ sin que tengas que abrirla." } }, - "da" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Indlæser..." + "value" : "Les notifications vous donnent des informations importantes sur l'application %1$@ sans avoir à l'ouvrir." } }, - "de" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Laden…" + "value" : "התראות מעבירות לך מידע חשוב על האפליקציה %1$@ מבלי לדרוש ממך לפתוח את האפליקציה." } }, - "es" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Cargando..." + "value" : "Le notifiche ti forniscono informazioni importanti sull'app %1$@ senza che tu debba aprire l'app." } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ladataan..." + "value" : "Varslinger gir deg viktig %1$@ app informasjon uten at du behøver å åpne appen." } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Chargement..." + "value" : "Meldingen geven je belangrijke %1$@ appinformatie zonder dat je de app hoeft te openen." } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Loading..." + "value" : "Powiadomienia zawierają ważne informacje o aplikacji %1$@ bez konieczności otwierania aplikacji." } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Caricamento in corso..." + "value" : "Notificările vă oferă informații importante despre aplicația %1$@ fără a fi necesar să deschideți aplicația." } }, - "ja" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "ロード中..." + "value" : "Уведомления предоставляют важную информацию о приложении %1$@, не требуя открытия приложения." } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Laster inn..." + "value" : "Bildirimler, uygulamayı açmanıza gerek kalmadan size önemli %1$@ uygulama bilgilerini verir." } }, - "nl" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Laden..." + "value" : "通知可在无需打开 %1$@ 应用的情况下,向你提供重要信息。" } - }, - "pl" : { + } + } + }, + "Notifications give you important %1$@ app information without requiring you to open the app.\n\nKeep these turned ON in your phone’s settings to ensure you receive %1$@ Notifications, Critical Alerts, and Time Sensitive Notifications." : { + "comment" : "Alert Permissions descriptive text (1: app name)", + "localizations" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ładowanie..." + "value" : "Meddelelser giver dig vigtige oplysninger om %1$@-appen, uden at du behøver at åbne appen.\n\nLad dem være aktiveret i telefonens indstillinger for at sikre, at du modtager %1$@-meddelelser, kritiske advarsler og tidsfølsomme meddelelser." } }, - "pt-BR" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Carregando..." + "value" : "Benachrichtigungen geben Dir wichtige %1$@ App-Informationen, ohne dass Du die App öffnen musst.\n\nLass diese in den Einstellungen Deines Telefons aktiviert, um sicherzustellen, dass Du %1$@ Benachrichtigungen, kritische Warnungen und zeitkritische Benachrichtigungen erhältst." } }, - "ro" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Se încarcă..." + "value" : "Las notificaciones te proporcionan información importante sobre la aplicación %1$@ sin que tengas que abrirla.\n\nManten estas activadas en los ajustes del teléfono para recibir notificaciones %1$@, alertas críticas y notificaciones sensibles al tiempo cuando se entregan." } }, - "ru" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Загрузка..." + "value" : "Les notifications vous donnent des informations importantes sur l’application %1$@ sans que vous ayez à ouvrir l’application.\n\nGardez-les activées dans les paramètres de votre téléphone pour vous assurer de recevoir Notifications, Alertes critiques et Notifications urgentes de %1$@." } }, - "sv" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Laddar..." + "value" : "התראות מעניקות לך מידע חשוב על %1$@ מבלי לדרוש ממך לפתוח את האפליקציה.\n\nכדי להבטיח שתקבל התראות %1$@, התראות קריטיות והתראות רגישות לזמן, וודא שהן מופעלות." } }, - "tr" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Yükleniyor..." + "value" : "Le notifiche ti forniscono informazioni importanti sull'app %1$@ senza che tu debba aprire l'app. \n\nTienile attive nelle impostazioni del tuo telefono per assicurarti di ricevere %1$@ notifiche, avvisi critici e notifiche sensibili al tempo." } }, - "vi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Đang tải..." + "value" : "Varsler gir deg viktig %1$@ appinformasjon uten at du trenger å åpne appen. \n\n Hold disse slått PÅ i telefonens innstillinger for å sikre at du mottar %1$@ -varsler, kritiske varsler og tidssensitive varsler." } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "读取中..." - } - } - } - }, - "Lock Screen / Dynamic Island / CarPlay" : { - "comment" : "The title of a section in the live activity settings view, related to lock screen, dynamic island, or carplay.", - "isCommentAutoGenerated" : true, - "localizations" : { - "de" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Sperrbildschirm / Dynamic Island / CarPlay" + "value" : "Meldingen geven je belangrijke %1$@ appinformatie zonder dat je de app hoeft te openen.\n\nHoud deze instellingen AAN in je telefooninstellingen om ervoor te zorgen dat %1$@ je meldingen, Kritieke meldingen en Tijdgevoelige meldingen ontvangt." } }, - "fr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Écran verrouillé / Dynamic Island / CarPlay" + "value" : "Powiadomienia dostarczają ważnych informacji o aplikacji %1$@ bez konieczności otwierania aplikacji. \n\nWłącz je w ustawieniach telefonu, aby mieć pewność, że będziesz otrzymywać powiadomienia %1$@ , alerty krytyczne i powiadomienia zależne od czasu." } }, - "nb" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Låseskjerm / Dynamic Island / CarPlay" + "value" : "Notificările vă oferă informații importante despre aplicația %1$@ fără a fi necesar să deschideți aplicația. \n\nPăstrați-le activate în setările telefonului pentru a vă asigura că primiți notificări %1$@, alerte critice și notificări urgente." } }, - "nl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Toegangsscherm / Dynamic Island / CarPlay" + "value" : "Уведомления предоставляют важную информацию о приложении %1$@, не требуя открытия приложения.\n\nВключите их в настройках телефона, чтобы получать уведомления %1$@, критические предупреждения и уведомления, чувствительные к времени." } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Ecran de blocare / Insulă dinamică / CarPlay" + "value" : "Bildirimler, uygulamayı açmanıza gerek kalmadan size önemli %1$@ uygulama bilgilerini verir. \n\n %1$@ Bildirimler, Kritik Uyarılar ve Zamana Duyarlı Bildirimler aldığınızdan emin olmak için telefonunuzun ayarlarında bunları AÇIK durumda tutun." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "锁屏 / 灵动岛 / CarPlay 车载" + "value" : "通知可在无需打开 %1$@ 应用的情况下,向你提供重要信息。\n\n请在手机设置中保持通知开启,以确保你能够接收 %1$@ 通知、关键通知和时效性通知。" } } } }, - "Lock Screen, Dynamic Island, and CarPlay display" : { - "comment" : "Live Activity settings descriptive text" + "Observed changes in glucose, subtracting changes modeled from insulin delivery, can be used to estimate carbohydrate absorption." : { + "comment" : "Section explaining carb effects chart" }, - "Log Dose" : { - "comment" : "Accessibility label for the manual dose entry button on the insulin delivery screen\nButton text to log a dose\nTitle for dose logging screen", + "Off" : { + "comment" : "Notification Setting Status is Off", "localizations" : { + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vypnuto" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Log dosis" + "value" : "Slukket" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Dosis speichern" + "value" : "Aus" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Registrar dosis" + "value" : "Apagado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Kirjaa annos" + "value" : "Pois päältä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Enregistrer la dose" + "value" : "Désactivé" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כבוי" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Registra dose" + "value" : "Disattivato" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Logg Dose" + "value" : "Av" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Registreer dosis" + "value" : "Uit" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Zarejestruj dawkę" + "value" : "Wyłącz" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Înregistrați doza" + "value" : "Oprit" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Доза из лога" + "value" : "Выключено" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vypnuté" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Logga Dos" + "value" : "Av" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Günlük Doz" + "value" : "Kapalı" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "记录注射量" + "value" : "关闭" } } } }, - "Logged Insulin Dose" : { - "comment" : "The title of the screen displaying a manually entered insulin dose", + "Oh no! Loop crashed while dosing, and insulin adjustments have been paused until this dialog is closed. Dosing history may not be accurate. Please review Insulin Delivery charts, and monitor your blood glucose carefully." : { + "comment" : "Modal body for crash recovery alert", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Logget insulindosis" + "value" : "Åh nej! Loop gik ned under dosering, og insulinjusteringer er blevet sat på pause, indtil denne dialogboks er lukket. Doseringshistorikken er muligvis ikke nøjagtig. Gennemgå venligst insulintilførsindstillinger og overvåg dit blodsukker omhyggeligt." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Gespeicherte Insulindosis" + "value" : "Oh nein! Loop ist während des Bolus abgestürzt und die Insulinanpassungen wurden angehalten, bis dieser Dialog geschlossen wird. Der Dosierung-Verlauf ist möglicherweise nicht korrekt. Bitte prüfe die Tabellen zur Insulinabgabe und überwache Deinen Blutzucker sorgfältig." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Dosis de insulina registrada" + "value" : "¡Oh, no! Loop falló durante la dosificación y los ajustes de insulina se pausaron hasta que se cierre este cuadro de diálogo. El historial de dosificación puede no ser exacto. Revise los gráficos de administración de insulina y controle cuidadosamente su nivel de glucosa en sangre." } }, - "fi" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Kirjattu insuliiniannos" + "value" : "Oh non ! La boucle s'est arrêtée pendant le dosage, et les ajustements d'insuline ont été mis en pause jusqu'à ce que ce dialogue soit fermé. L'historique des dosages peut ne pas être exact. Veuillez revoir les tableaux d'administration d'insuline et surveiller attentivement votre glycémie." } }, - "fr" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Dose d'insuline enregistrée" + "value" : "אוי לא! Loop קרסה בזמן הזרקה והתאמות אינסולין נעצרו עד שתסגור חלון זה. ייתכן שהיסטוריות ההזרקות לא תהיה מדוייקת. עיין בגרף מתן האינסולין ועקוב אחר הגלוקוז שלך מקרוב." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Dose d'insulina registrata" + "value" : "Oh No! Loop si è chiuso mentre stava eseguendo un bolo e il dosaggio d'insulina è stato messo in pausa, finchè la finestra sarà chiusa. L'elenco dell'infusione d'insulina potrebbe non essere accurato. Per favore rivedi con attenzione la tabella di infusione dell'insulina e sorveglia strettamente la tua glicemia" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Logget insulindose" + "value" : "Å nei! Loop krasjet under dosering, og insulinjusteringer er satt på pause til denne dialogen er lukket. Doseringshistorikken er kanskje ikke nøyaktig. Vennligst sjekk diagrammer for insulin levering, og overvåk blodsukkeret nøye." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Geregistreerde insulinedosis" + "value" : "Oh nee! Loop is vastgelopen tijdens het toedienen, en insulineaanpassingen zijn gepauzeerd totdat dit dialoogvenster wordt gesloten. De doseringsgeschiedenis is mogelijk niet nauwkeurig. Bekijk de Insulinetoedieningsgrafieken en controleer je bloedglucose nauwkeurig." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Zarejestrowana dawka insuliny" + "value" : "O nie! Pętla uległa awarii podczas dozowania, a regulacja insuliny została wstrzymana do czasu zamknięcia tego okna dialogowego. Historia dawkowania może nie być dokładna. Przejrzyj wykresy podawania insuliny i uważnie monitoruj poziom glukozy we krwi." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Doza de insulină înregistrată" + "value" : "Oh nu! Loop s-a blocat în timpul administrării, iar ajustările insulinei au fost întrerupte până la închiderea acestui dialog. Istoricul administrării poate să nu fie exact. Vă rugăm să consultați graficele de administrare a insulinei și să vă monitorizați cu atenție glicemia." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Зарегистрированная доза инсулина" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Loggad insulindos" + "value" : "Внимание! Во время подачи произошел сбой петли, и управление помпой было приостановлено до закрытия этого диалога. История событий может быть неточной. Пожалуйста, просмотрите графики введения инсулина в помпе и внимательно следите за уровнем глюкозы в крови." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kayıtlı İnsülin Dozu" + "value" : "Oh hayır! Dozlama sırasında Loop çöktü ve bu iletişim kutusu kapatılana kadar insülin ayarlamaları duraklatıldı. Dozlama geçmişi doğru olmayabilir. Lütfen İnsülin İletim tablolarını gözden geçirin ve kan şekerinizi dikkatle izleyin." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "记录的胰岛素剂量" + "value" : "糟糕!Loop 在给药过程中发生故障,胰岛素调整功能已暂停,直至关闭此对话框。给药记录可能不准确。请查看胰岛素输注图表,并密切监测您的血糖水平。" } } } }, - "Loggly" : { - "comment" : "The title of the loggly service", - "extractionState" : "manual", + "OK" : { + "comment" : "Alert acknowledgment OK button\nCritical Alert permissions disabled alert button\nDefault action for alert when alert acknowledgment fails\nLabel for acknowledging the preset has been active for 24 hours\nNotifications permissions disabled alert button\nText for ok action on notification of upcoming TestFlight expiration\nText for ok action on notification of upcoming profile expiration\nThe title of the notification action to acknowledge a device alert", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "موافق" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, - "en" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "אישור" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "Tamam" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Loggly" + "value" : "OK" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" } } } }, - "Loop Crashed" : { - "comment" : "Title for crash recovery alert", + "Omar asks himself, **do I expect I will need more or less insulin than usual?**" : { + + }, + "Omar Octopus wants to create a preset for some yard work he’ll be doing around the house." : { + + }, + "Omar sets his correction range a little higher, to %@-%@ %@. This tells %@ to step in sooner." : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Omar sets his correction range a little higher, to %1$@-%2$@ %3$@. This tells %4$@ to step in sooner." + } + } + } + }, + "Omar’s Current Therapy Settings" : { + + }, + "On" : { + "comment" : "Notification Setting Status is On", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "On" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zapnuto" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Loop er crashet" + "value" : "Tændt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Loop ist abgestürzt" + "value" : "An" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Falla del Loop" + "value" : "Encendido" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Päällä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Panne de Loop" + "value" : "Activé" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Loop קרס" + "value" : "מופעל" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop è crashato" + "value" : "Attivato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "オン" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loop krasjet" + "value" : "På" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop is vastgelopen" + "value" : "Aan" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pętla uległa awarii" + "value" : "Włącz" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ligado" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Loop s-a închis" + "value" : "Pornit" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Произошел сбой приложения" + "value" : "Включено" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zapnuté" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "På" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop Çöktü" + "value" : "Açık" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "On" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "loop 崩溃了" + "value" : "开" } } } }, - "Loop Failure" : { - "comment" : "The notification title for a loop failure", + "On until" : { + + }, + "on until %@" : { + "comment" : "The format for the description of a custom preset end date\nThe format for the description of a finite custom preset end date" + }, + "on until carbs added" : { + "comment" : "The format for the description of a premeal preset end date" + }, + "on until turned off" : { + "comment" : "The format for the description of an indefinite custom preset end date" + }, + "Once saved, Omar’s new preset will display in his Presets lists." : { + + }, + "Once you have allowed or denied a data type, %1$@ cannot ask again from within the app. To review or change access, open the Health app, tap your profile, then Apps → %1$@." : { + "comment" : "Health access change instructions (1: app name)" + }, + "Open iOS Settings" : { + "comment" : "A button that opens the iOS settings app.", + "isCommentAutoGenerated" : true + }, + "Other" : { + "comment" : "The group name for plugins that do not declare a manufacturer or category", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "فشل في الحلقة المغلقة" + "value" : "أخرى" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jiné" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Loop-fejl" + "value" : "Andet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Loop fehlgeschlagen" + "value" : "Andere" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Falla del Loop" + "value" : "Otro" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Loopin häiriö" + "value" : "Muu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Echec de Loop" + "value" : "Autre" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Loop Failure" + "value" : "אחר" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egyéb" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Malfunzionamento di Loop" + "value" : "Altro" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ループの不良" + "value" : "その他" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loop-feil" + "value" : "Annet" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loopstoring" + "value" : "Anders" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Awaria pętli" + "value" : "Inne" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Falha no Loop" + "value" : "Outro" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Eșec buclă" + "value" : "Altul" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Ошибка в работе петли" + "value" : "Другое" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Iné" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Loopfel" + "value" : "Annat" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Döngü Hatası" + "value" : "Diğer" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Інше" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Loop lỗi" + "value" : "Khác" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Loop失败" + "value" : "其他" } } } }, - "Loop has detected an issue with your Bluetooth settings, and will not work successfully until Bluetooth is enabled. You will not receive glucose readings, or be able to bolus." : { - "comment" : "Bluetooth unavailable alert body.", + "Override Presets" : { + "comment" : "The title text for the override presets", + "extractionState" : "manual", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تخطي الإعدادات المسبقة" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Loop har opdaget et problem med dine Bluetooth-indstillinger, og fungerer ikke korrekt, før Bluetooth er aktiveret. Du vil ikke få blodsukkeraflæsninger eller være i stand til at give bolus." + "value" : "Override forudindstillinger" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Loop hat ein Problem mit Deinen Bluetooth-Einstellungen festgestellt und funktioniert nicht, bis Bluetooth aktiviert ist. Du erhältst keine Blutzucker-Werte und es kann kein Bolus abgeben werden." + "value" : "Voreinstellungen" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Override Presets" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Loop ha detectado un problema con la configuración de Bluetooth, y no funcionará correctamente hasta que el Bluetooth esté activado. No recibirás lecturas de glucosa, ni podrás dar los bolos." + "value" : "Sobreescrituras preestablecidas" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Loop on havainnut Bluetooth-asetuksissa ongelman, eikä se toimi oikein ennen kuin Bluetooth on otettu käyttöön. Et saa glukoosilukemia, etkä voi antaa bolusta." + "value" : "Tilapäisasetukset" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop a détecté un problème avec vos paramètres Bluetooth, et ne fonctionnera pas correctement tant que le Bluetooth ne sera pas activé. Vous ne pourrez pas recevoir de lectures de glucose, ni être en mesure de faire un bolus." + "value" : "Préréglages ajustement" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "עקוף הגדרות מוגדרות מראש" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop ha rilevato un problema con le tue impostazioni Bluetooth e non funzionerà correttamente finché il Bluetooth non sarà attivato. Non riceverai letture glicemiche né potrai eseguire il bolo." + "value" : "Override" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "オーバーライドプリセット" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loop har oppdaget et problem med Bluetooth-innstillingene dine, og vil ikke fungere før Bluetooth er aktivert. Du vil ikke motta blodsukkermålinger, eller være i stand til å gi bolus." + "value" : "Overstyr forhåndsinnstillinger" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop heeft een probleem met je Bluetooth-instellingen gedetecteerd en zal niet goed werken totdat Bluetooth wordt ingeschakeld. Je ontvangt geen glucosemetingen en je kunt niet bolussen." + "value" : "Override programma's" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop wykrył problem z ustawieniami Bluetooth i nie będzie działać poprawnie, dopóki Bluetooth nie zostanie włączony. Nie będziesz otrzymywać odczytów poziomu glukozy ani możliwości podania bolusa." + "value" : "Override Presets" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sobreposições Predefinidas" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Loop a detectat o problemă cu setările Bluetooth și nu va funcționa cu succes până când Bluetooth nu este activat. Nu veți primi valori ale glicemiei sau nu veți putea face bolus." + "value" : "Presetări de înlocuire" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Loop обнаружил проблему в настройках Bluetooth и не будет успешно работать, пока Bluetooth не будет включен. Вы не будете получать показания глюкозы и не сможете вводить болюс." + "value" : "Редактировать параметры" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Loop har upptäckt ett problem med dina Bluetooth-inställningar och kommer inte att fungera förrän Bluetooth är aktiverat. Du kommer varken att kunna se dina blodsockervärden eller att kunna ge någon bolus." + "value" : "Override förinställningar" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop, Bluetooth ayarlarınızla ilgili bir sorun algıladı ve Bluetooth etkinleştirilene kadar başarılı bir şekilde çalışmayacaktır. KŞ okumaları almayacaksınız veya bolus yapamayacaksınız." + "value" : "Geçersiz Kılma Ön Ayarları" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cài đặt chồng liều" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Loop 检测到您的蓝牙设置存在问题,在蓝牙启用之前将无法正常工作。\n您将无法接收血糖读数,也无法推注大剂量。" + "value" : "覆盖预设置" } } } }, - "Loop has detected an missed meal and estimated its size. Edit the carb amount to match the amount of any carbs you may have eaten." : { - "comment" : "Warning displayed when user is adding a meal from an missed meal notification", + "Overview" : { + + }, + "Paloma Porpoise sees her glucose is running higher than usual. She creates a preset to help manage her glucose while she is sick." : { + + }, + "Paloma wants %@ to know she needs more insulin than usual." : { + + }, + "Paloma’s Adjusted Therapy Settings" : { + + }, + "Paloma’s Current Therapy Settings" : { + + }, + "Pay attention to your insulin needs before and after exercising, playing sports, or doing unusually hard physical labor." : { + + }, + "Performance History" : { + "comment" : "The title of the view that shows the user's preset performance history.", + "isCommentAutoGenerated" : true + }, + "Physical stress, like illness, can cause glucose to rise." : { + + }, + "Planning for physical activity can be tough. If you forget to set a preset ahead of time, consider these strategies:" : { + + }, + "Please go to the App Store now to update the app." : { + "comment" : "Required update modal paragraph 3" + }, + "Possible Missed Meal" : { + "comment" : "The notification title for a meal that was possibly not logged in Loop.", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Loop har opdaget et overset måltid og vurderet dets størrelse. Rediger mængden af kulhydrater, så den svarer til mængden af kulhydrater, du har spist." + "value" : "Muligt glemt måltid" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Loop hat eine vergessene Mahlzeit erkannt und deren Größe geschätzt. Passe die KH auf die Menge an, die Du wahrscheinlich gegessen hast." + "value" : "Wahrscheinlich eine Mahlzeit vergessen" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop a détecté un repas manqué et a estimé sa taille. Modifiez la quantité de glucides pour qu'elle corresponde à la quantité de glucides que vous avez peut-être mangée." + "value" : "Repas manqué possible" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Loop זיהה ארוחה שלא הוזנה והעריך את גודלה. ערוך את מספר הפחמימות כדי להתאים אותו לזה שאכלת." + "value" : "ייתכן שארוחה לא הוזנה" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop ha rilevato un pasto saltato e ne ha stimato le dimensioni. Modifica la quantità di carboidrati in modo che corrisponda alla quantità di carboidrati che potresti aver mangiato." + "value" : "Possibile pasto saltato" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loop har oppdaget et glemt måltid og estimert størrelsen. Rediger karbohydratmengden for å matche mengden av karbohydrater du måtte ha spist." + "value" : "Mulig savnet måltid" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop heeft een gemiste maaltijd gedetecteerd en een schatting van de hoeveelheid gedaan. Bewerk de hoeveelheid koolhydraten, zodat deze overeenkomt met de hoeveelheid koolhydraten die je mogelijk hebt gegeten." + "value" : "Mogelijk gemiste maaltijd" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pętla wykryła pominięty posiłek i oszacowała jego wielkość. Edytuj ilość węglowodanów, aby odpowiadała ilości węglowodanów, które mogłeś zjeść." + "value" : "Możliwe pominięcie posiłku" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Loop a detectat o masă neanunțată și a estimat dimensiunea acesteia. Editați cantitatea de carbohidrați pentru a se potrivi cu cantitatea de carbohidrați pe care ați consumat-o." + "value" : "Posibilă masă neanunțată" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Loop обнаружил пропущенный прием пищи и оценил его размер. Отредактируйте количество углеводов, чтобы оно соответствовало количеству тех углеводов, которые вы, возможно, съели." + "value" : "Возможный пропуск приема пищи" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop atlanmış bir öğün tespit etti ve boyutunu tahmin etti. Yemiş olabileceğiniz karbonhidrat miktarına uyması için karbonhidrat miktarını düzenleyin." + "value" : "Muhtemel Kaçırılan Öğün" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Loop 检测到一次可能遗漏的进食,并估算了碳水量。请根据实际摄入情况修改碳水数值。" + "value" : "可能未进餐" } } } }, - "Loop has not completed successfully in %@" : { - "comment" : "The notification alert describing a long-lasting loop failure. The substitution parameter is the time interval since the last loop", + "Power lifting" : { + + }, + "Pre-meal Preset" : { + "comment" : "Status row title for premeal override enabled" + }, + "Pre-Meal Targets" : { + "comment" : "The label of the pre-meal mode toggle button", + "extractionState" : "stale", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "لم تتم الحلقة المغلقة بنجاح منذ %@" + "value" : "أهداف ما قبل الوجبة" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Loop har ikke kørt korrekt i %@" + "value" : "Før-måltid Mål" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Loop wurde nicht erfolgreich abgeschlossen seit %@" + "value" : "Ziel vor dem Essen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Loop no ha terminado correctamente en %@" + "value" : "Objetivos Pre-Comida" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Häiriö Loopin toiminnassa %@" + "value" : "Ennen ateriaa -tavoite" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop n'a pas bouclé avec succès depuis %@" + "value" : "Objectif de Pré-Repas" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Loop has not completed successfully in %@" + "value" : "יעדים לפני הארוחה" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop non ha funzionato correttamente per %@" + "value" : "Obiettivo pre-pasto" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ループが %@ の間クローズされていません" + "value" : "食前ターゲット" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loop har ikke fullført i %@" + "value" : "Målområde før måltid" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop is niet goed afgerond in %@" + "value" : "Pre-Meal doelen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop nie działał poprawnie przez %@" + "value" : "Poziom przed posiłkiem" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Nenhum ciclo completo com sucesso em %@" + "value" : "Meta Pré-Refeição" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Loop nu a rulat cu succes timp de %@" + "value" : "Ținte înainte de masă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Ну удалось успешно замкнуть цикл/контур в %@" + "value" : "Целевые значения до еды" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Loop har inte lyckats köra på %@" + "value" : "Målvärden före måltid" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Döngü %@ içinde başarıyla tamamlanamadı" + "value" : "Yemek Öncesi Hedefler" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Loop không hoạt động thành công trong %@" + "value" : "Mục tiêu trước bữa ăn" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Loop运行异常 %@" + "value" : "餐前目标" } } } }, - "Loop is already looping." : { - "comment" : "The error message displayed for LoopError.loopInProgress errors." - }, - "Loop normally gives 40% of your predicted insulin needs each dosing cycle.\n\nWhen the Glucose Based Partial Application experiment is enabled, Loop will vary the percentage of recommended bolus delivered each cycle with glucose level.\n\nNear correction range, it will use 20% (similar to Temp Basal), and gradually increase to a maximum of 80% at high glucose (200 mg/dL, 11.1 mmol/L).\n\nPlease be aware that during fast rising glucose, such as after an unannounced meal, this feature, combined with velocity and retrospective correction effects, may result in a larger dose than your ISF would call for." : { - "comment" : "Description of Glucose Based Partial Application toggle.", + "Predicted glucose at %1$@ is %2$@." : { + "comment" : "Message when offering bolus recommendation even though bg is below range and minBG is in future. (1: glucose time)(2: glucose number)", "localizations" : { - "de" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Loop verabreicht normalerweise 40% Deines voraussichtlichen Insulinbedarfs pro Dosierungszyklus. \n\nWenn das Experiment zur glukosebasierten partiellen Verabreichung aktiviert ist (Glucose Based Partial Application), variiert Loop den Prozentsatz des empfohlenen Bolus, der pro Zyklus verabreicht wird, je nach Glukosespiegel. \n\nNahe dem unterem Korrekturbereich werden 20% verwendet (ähnlich wie bei Temp Basal) und bei hohem Glukosespiegel (200 mg/dl, 11,1 mmol/l) schrittweise auf maximal 80% erhöht. \n\nBitte beachte, dass diese Funktion bei schnell ansteigendem Glukosespiegel, etwa nach einer unangekündigten Mahlzeit, in Kombination mit Geschwindigkeits- und retrospektiven Korrektureffekten zu einer höheren Dosis führen kann, als Dein ISF erfordern würde." + "value" : "قراءاة سكر الدم بعد %1$@ هي %2$@." } }, - "fr" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Loop administre normalement 40 % des besoins prévus en insuline à chaque cycle de dosage.\n\nLorsque l'application partielle basée sur la glycémie est activée, Loop fait varier le pourcentage du bolus recommandé administré à chaque cycle en fonction du niveau de glucose.\n\nÀ proximité de la plage de correction, il utilisera 20 % (similaire à Temp Basal), et augmentera progressivement jusqu'à un maximum de 80 % à un niveau de glucose élevé (200 mg/dL, 11,1 mmol/L).\n\nVeuillez noter qu'en cas d'augmentation rapide du glucose, par exemple après un repas non annoncé, cette fonction, combinée aux effets de vitesse et de correction rétrospective, peut entraîner une dose plus importante que ce que votre ISF préconise." + "value" : "Forventet glukose ved %1$@ er %2$@." } }, - "nb" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Loop gir normalt 40 % av det forventede insulinbehovet ditt i hver doseringssyklus. Når eksperimentet Glukosebasert delvis tilførsel er aktivert, vil Loop variere prosentandelen av anbefalt bolus som gis i hver syklus med glukosenivået.\n\nI nærheten av korreksjonsområdet vil den bruke 20 % (på samme måte som Temp Basal), og gradvis øke til maksimalt 80 % ved høyt glukosenivå (200 mg/dL, 11,1 mmol/L). Vær oppmerksom på at ved raskt stigende glukose, for eksempel etter et uanmeldt måltid, kan denne funksjonen, kombinert med hastighet og retrospektive korreksjonseffekter, resultere i en større dose enn det ISF-en din ville ha krevd." + "value" : "Vorhergesagte Glukose um %1$@ ist %2$@." } }, - "nl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Loop geeft normaal gesproken per doseercyclus 40% van je voorspelde insulinebehoefte.\n\nAls het experiment Glucose-afhankelijke gedeeltelijke toediening aan staat, past Loop het percentage van de aanbevolen bolus dat per cyclus wordt toegediend aan op je glucosewaarde.\n\nIn de buurt van je correctiebereik is dat 20% (vergelijkbaar met Tijdelijke basaal). Bij hoge glucose loopt het geleidelijk op tot maximaal 80% (200 mg/dL, 11,1 mmol/L).\n\nLet op: bij snel stijgende glucose, zoals na een niet-ingevoerde maaltijd, kan deze functie samen met de effecten van snelheid en retrospectieve correctie een grotere dosis geven dan je ISF zou aangeven." + "value" : "Glucosa proyectada a las %1$@ es %2$@." } }, - "ro" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "În mod normal, Loop furnizează 40% din necesarul de insulină estimat pentru fiecare ciclu de dozare. \n \nCând algoritmul experimental Aplicare parțială bazată pe glicemie este activat, Loop o să varieze procentul de bolus recomandat administrat pentru fiecare ciclu în funcție de nivelul glicemiei.\n \nÎn apropierea intervalului de corecție, va utiliza 20% (similar cu o bazală temporar) și va crește treptat până la maximum 80% la glicemie ridicată (200 mg/dl, 11,1 mmol/l). \n \nVă rugăm să rețineți că în timpul creșterii rapide a glicemiei, cum ar fi după o masă neanunțată, această funcție, combinată cu efectele vitezei și ale corecției retrospective, poate duce la o doză mai mare decât ar necesita sensibilitatea dumneavoastră la insulină." + "value" : "Ennustettu glukoosi klo %1$@ on %2$@." } }, - "zh-Hans" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop 通常在每个给药周期中提供您预测胰岛素需求的 40%。\n\n启用“基于血糖的部分给药实验功能”后,Loop 将根据血糖水平调整每个周期实际推注的大剂量比例。\n\n当血糖接近矫正目标范围时,仅注射 20%(类似于临时基础率),血糖升高时比例会逐步增加,在高血糖状态(200 mg/dL,11.1 mmol/L)时最高可达 80%。\n\n请注意,当血糖快速上升(例如未申报的进食)时,该功能与血糖变化速度及回顾性矫正机制叠加,可能导致注射剂量超过由胰岛素敏感系数(ISF)计算出的剂量。" + "value" : "Glycémie prévue à %1$@ est %2$@." } - } - } - }, - "Loop will automatically bolus when insulin needs are above scheduled basal, and will use temporary basal rates when needed to reduce insulin delivery below scheduled basal." : { - "comment" : "Description string for automatic bolus dosing strategy", - "localizations" : { - "da" : { + }, + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Loop vil automatisk give bolus, når insulinbehov er over planlagt basal, og vil bruge midlertidige basalrater, når det er nødvendigt for at reducere insulinlevering under planlagt basal." + "value" : "הגלוקוז החזוי ב- %1$@ הוא %2$@ ." } }, - "de" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop gibt automatisch einen Bolus ab, wenn der Insulinbedarf über der geplanten Basalrate liegt, und verwendet temporäre Basalraten, wenn dies erforderlich ist, um die Insulinabgabe unter die geplante Basalrate zu reduzieren." + "value" : "La glicemia prevista a %1$@ è di %2$@." } }, - "es" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Loop administrará bolos automáticamente cuando las necesidades de insulina estén por encima del basal programado y utilizará ajustes temporales de basal cuando sea necesario para reducir la administración de insulina por debajo del basal programado." + "value" : "%1$@の予想グルコースは %2$@です。" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loop annostelee automaattisen boluksen kun insuliinitarve ylittää ohjelmoidun basaalin, ja käyttää tilapäisiä alhaisempia basaalitasoja kun tarvitaan vähemmän insuliinia." + "value" : "Forventet blodsukker kl %1$@ er %2$@." } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop effectue automatiquement des bolus lorsque les besoins en insuline sont supérieurs au débit de base programmé, et utilise des débits basaux temporaires si nécessaire pour réduire l'administration d'insuline en dessous du débit de base programmé." + "value" : "Voorspelde glucose om %1$@ is %2$@." } }, - "it" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop eseguirà automaticamente il bolo quando il fabbisogno d'insulina è superiore alla basale programmata e utilizzerà velocità basali temporanee quando necessario per ridurre l'erogazione d'insulina al di sotto della basale programmata." + "value" : "Przewidywany poziom cukru o %1$@ wyniesie %2$@" } }, - "nb" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Lopp vil sette bolus når insulinbehovet er over planlagt basal, og vil bruke midlertidige basale rater når det er nødvendig for å redusere insulintilførselen under planlagt basal" + "value" : "Glicemia prevista em %1$@ é %2$@." } }, - "nl" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Loop zal automatisch bolussen geven wanneer de insulinebehoefte groter is dan het ingestelde basaal, en Loop zal wanneer dat nodig is gebruik maken van tijdelijke basaalsnelheden om insulinetoediening te verlagen." + "value" : "Glicemia prognozată pentru %1$@ este %2$@." } }, - "pl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Pętla automatycznie poda bolusa, kiedy zapotrzebowanie na insulinę przekroczy zaplanowaną dawkę podstawową, a w razie potrzeby zredukuje zaplanowaną dawkę podstawową (bazę)." + "value" : "Прогнозируемый уровень глюкозы на %1$@ составляет %2$@." } }, - "ro" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Loop va bolusa automat când necesarul de insulină este deasupra bazalei programate, și va utiliza rate bazale temporare atunci când este necesar, pentru a reduce cantitatea de insulină administrată sub nivelul bazal programat." + "value" : "Predpokladaná glykémia o %1$@ je %2$@ ." } }, - "ru" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Loop автоматически вводит болюсы, когда потребность в инсулине превышает запланированную базу, и при необходимости использует ВБС, чтобы снизить подачу инсулина ниже запланированной базы." + "value" : "Förväntat glukosvärde vid %1$@ är %2$@." } }, - "sv" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop kommer att ge bolus automatiskt när insulinbehovet är större än ordinarie basal och kommer, vid behov, att minska din ordinarie basal med temporära basaldoser för att minska insulintillförseln." + "value" : "Tahmini KŞ %1$@ %2$@." } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Loop, insülin ihtiyaçları programlanan bazalın üzerine çıktığında otomatik olarak bolus yapacak ve gerektiğinde insülin iletimini programlanan bazalın altına düşürmek için geçici bazal oranları kullanacaktır." + "value" : "Dự đoán đường huyết vào lúc %1$@ là %2$@." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "当所需胰岛素高于计划基础率时,Loop 将自动推注大剂量;当所需胰岛素低于计划基础率时,则使用临时基础率以减少胰岛素输注" + "value" : "预测%1$@时的葡萄糖是%2$@" } } } }, - "Loop will not work successfully until Bluetooth is enabled. You will not receive glucose readings, or be able to bolus." : { - "comment" : "Bluetooth off background alert body.", + "Predicted glucose is in range." : { + "comment" : "Notice when predicted glucose for bolus recommendation is in range", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Loop vil ikke fungere, før Bluetooth er aktiveret. Du vil ikke modtage glukoseaflæsninger eller være i stand til at give bolus." + "value" : "Den forventede glukose er inden for intervallet." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Loop funktioniert nicht, bis Bluetooth aktiviert ist. Du erhältst keine Blutzuckerwerte und es kann kein Bolus abgeben werden." + "value" : "Der vorhergesagte Blutzucker liegt im Zielbereich." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Loop no funcionará correctamente hasta que el Bluetooth esté habilitado. No recibirá lecturas de glucosa ni podrá administrar bolus." + "value" : "La glucosa proyectada está en rango" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop ne fonctionnera pas correctement tant que le Bluetooth ne sera pas activé. Vous ne pourrez pas recevoir de lectures de glucose, ni être en mesure de faire un bolus." + "value" : "La glycémie prévue est dans la plage." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Loop לא תעבוד עד הפעלת Bluetooth. לא תוכל לקבל נתוני גלוקוז או להזריק בולוס." + "value" : "הגלוקוז החזוי נמצא בטווח." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop non funzionerà correttamente fino a quando il Bluetooth non sarà attivato. Non riceverai letture glicemiche né potrai eseguire il bolo." + "value" : "La glicemia prevista è nell'intervallo" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loop vil ikke fungere før Bluetooth er aktivert. Du vil ikke motta blodsukkermålinger, eller være i stand til å gi bolus." + "value" : "Forventet blodsukker er innenfor målområdet." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop werkt pas als Bluetooth is ingeschakeld. Je zult geen glucosemetingen ontvangen of een bolus kunnen toedienen." + "value" : "Voorspelde glucose is binnen bereik." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pętla nie będzie działać pomyślnie, dopóki Bluetooth nie zostanie włączony. Nie będziesz otrzymywać odczytów poziomu glukozy ani możliwości podania bolusa." + "value" : "Przewidywane stężenie glukozy jest w zakresie." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Loop nu va funcționa cu succes până când Bluetooth nu este activat. Nu veți primi citiri de glicemie sau nu veți putea să bolusați." + "value" : "Glicemia prognozată este în interval." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Loop не будет успешно работать, пока не будет включен Bluetooth. Вы не сможете получать показания уровня глюкозы или вводить болюсы." + "value" : "Прогнозируемый уровень глюкозы находится в диапазоне." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predpokladaná glykémia je v cieľovom rozsahu." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bluetooth etkinleştirilene kadar döngü başarılı bir şekilde çalışmayacaktır. KŞ ölçümleri alamayacak veya bolus yapamayacaksınız." + "value" : "Tahmini KŞ aralık içinde." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在启用蓝牙之前,Loop 无法正常工作。您将无法获取血糖读数,也不能执行大剂量输注。" + "value" : "预测血糖在目标范围内。" } } } }, - "Loop will set temporary basal rates to increase and decrease insulin delivery." : { - "comment" : "Description string for temp basal only dosing strategy", + "Predicted glucose of %1$@ is below your glucose safety limit setting." : { + "comment" : "Notice message when recommending bolus when BG is below the glucose safety limit. (1: glucose value)", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Loop vil fastsætte midlertidige basalrater for at øge og reducere insulinafgivelse." + "value" : "Det forventede glukoseindhold på %1$@ er under din indstilling af glukose-sikkerhedsgrænsen." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Loop stellt temporäre Basalraten ein, um die Insulinabgabe zu erhöhen oder zu verringern." + "value" : "Der vorhergesagte Blutzucker von %1$@ liegt unter der Sicherheitsgrenze." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Loop establecerá basal temporales para aumentar y disminuir la administración de insulina." + "value" : "Glucosa proyectada de %1$@ se encuentra por debajo de tu nivel de suspensión." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Loop käyttää tilapäisiä basaalitasoja lisätäkseen tai vähentääkseen insuliinin annostelua." + "value" : "Ennustettu glukoosi %1$@ on turvarajan alapuolella." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop permet de définir des débits de base temporaires pour augmenter et diminuer l'administration d'insuline." + "value" : "La glycémie estimée à %1$@ est sous le seuil de suspension." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Loop תגדיר בזאלי זמני כדי להגדיל ולהקטין מתן אינסולין." + "value" : "הגלוקוז החזוי %1$@ נמוך מגבול הבטיחות שהגדרת." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Loop imposterà velocità basali temporanee per aumentare e diminuire l'erogazione d'insulina." + "value" : "La glicemia prevista da %1$@ è al di sotto del tuo limite glicemico di sicurezza." } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Loop vil sette midlertidige basal rater for å øke og redusere insulin levering." + "value" : "Forventet blodsukker på %1$@ er lavere enn innstillingen for blodsukkersikkerhet." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Loop stelt tijdelijke basaalsnelheden in om de insulinetoediening te verhogen of te verlagen." + "value" : "Voorspelde glucose van %1$@ ligt onder je ingestelde glucoseveiligheidslimiet." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pętla ustawi tymczasowe dawki podstawowe, aby zwiększać lub zmniejszyć podawanie insuliny." + "value" : "Przewidywana glukoza %1$@ jest poniżej ustawionego bezpiecznego limitu glukozy." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Loop va stabili ratele bazale temporare pentru a crește și reduce cantitatea de insulina administrată." + "value" : "Glicemia prognozată de %1$@ se situează sub limita de siguranță configurată." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Петля установит ВБС для увеличения или уменьшения подачи инсулина." + "value" : "Прогнозируемое значение глюкозы %1$@ ниже установленного вами предела безопасности глюкозы." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Loop kommer att ställa in tillfälliga basalnivåer för att öka eller minska insulintillförsel." + "value" : "Förväntat blodsocker på %1$@ är under ditt tröskelvärde." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Loop, insülin iletimini artırmak ve azaltmak için geçici bazal oranlar ayarlayacaktır." + "value" : "%1$@ tahmini KŞ, KŞ güvenlik limiti ayarınızın altında." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Loop 将设置临时基础率,以增加或减少胰岛素输注。" + "value" : "预测血糖 %1$@ 低于你设定的血糖安全下限。" } } } }, - "Low" : { - "comment" : "Time-in-range band label (54–69 mg/dL)" - }, - "Low Glucose" : { - "comment" : "Title for bolus screen warning when glucose is below glucose warning limit.\nTitle for bolus screen warning when glucose is below suspend threshold, but a bolus is recommended", + "Predicted glucose of %1$@ is below your suspend threshold setting." : { + "comment" : "Notice message when recommending bolus when BG is below the suspend threshold. (1: glucose value)", + "extractionState" : "manual", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قراءة سكر الدم المتوقعة %1$@ أقل من قيمة تعليق الضخ في الإعدادات." + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Lav glukose" + "value" : "Forventet glukose på %1$@ er under din indstilling for suspenderingstærskel." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Niedriger Blutzucker" + "value" : "Der vorhergesagte Blutzucker von %1$@ liegt unter dem Grenzwert für die Hypo-Abschaltung." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predicted glucose of %1$@ is below your suspend threshold setting." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa baja" + "value" : "Glucosa proyectada de %1$@ se encuentra por debajo de su nivel de suspensión." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ennustettu glukoosi %1$@ on pysäytysrajan alapuolella." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glycémie basse" + "value" : "Prédiction de la glycémie à %1$@ sous le seuil de suspension défini." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "גלוקוז נמוך" + "value" : "הגלוקוז החזוי %1$@ נמוך מסך ההשהייה שהגדרת." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia bassa" + "value" : "La glicemia prevista %1$@ è inferiore al valore soglia per la sospensione dell'erogazione." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "予想グルコースは %1$@ で一時停止値を下回ります。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Lavt blodsukker" + "value" : "Forventet blodsukker %1$@ er lavere enn innstilling for insulinstopp" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Lage glucose" + "value" : "Verwachte glucose van %1$@ is lager dan je ingestelde insulineonderbrekingsdrempel." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Niski poziom glukozy" + "value" : "Przewidywany poziom cukru %1$@ jest poniżej progu zawieszenia." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Glicemia prevista de %1$@ está abaixo do limite de suspensão." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemie scăzută" + "value" : "Glicemia prognozată de %1$@ se situează sub limita de suspendare configurată" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Низкий уровень глюкозы" + "value" : "Предсказываемая гликемия %1$@ ниже ваших настроек порога приостановки помпы" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Förväntat glukosvärde %1$@ är under ditt tröskelvärde." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Düşük KŞ" + "value" : "Tahmini KŞ %1$@ askıya alma eşiği ayarınızın altında." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dự đoán đường huyết %1$@ là dưới ngưỡng tạm ngưng trong cài đặt của bạn." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "低血糖" + "value" : "预测葡萄糖%1$@低于您的暂停阈值设置" } } } }, - "Make sure to keep Notifications and Time Sensitive Notifications turned ON in iOS Settings to receive essential safety and maintenance notifications." : { - "comment" : "Time sensitive notifications callout message when Critical Alerts are unavailable" - }, - "Make sure to keep Notifications, Time Sensitive Notifications, and Critical Alerts turned ON in iOS Settings to receive essential safety and maintenance notifications." : { - "comment" : "Time sensitive notifications callout message" - }, - "Manage iOS Permissions" : { - "comment" : "Manage Permissions in Settings button text" - }, - "Manage Permissions in Settings" : { - "comment" : "Manage Permissions in Settings button text", - "extractionState" : "stale", + "Predicted: %1$@\nActual: %2$@ (%3$@)" : { + "comment" : "Format string describing retrospective glucose prediction comparison. (1: Predicted glucose)(2: Actual glucose)(3: difference)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "التوقع: %1$@\nالواقع: %2$@ (%3$@)" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Administrer tilladelser i Indstillinger" + "value" : "Forventet: %1$@\nFaktisk: %2$@ (%3$@)" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Berechtigungen in den Einstellungen verwalten" + "value" : "Vorhergesagt: %1$@\nAktuell: %2$@ (%3$@)" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Administrar permisos en Configuración" + "value" : "Predicción: %1$@\nActual: %2$@ (%3$@)" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ennustettu: %1$@\nTodellinen: %2$@ (%3$@)" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Gérer les permissions dans les paramètres" + "value" : "Prédit : %1$@\nRéel : %2$@ (%3$@)" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "קבע הרשאות בהגדרות" + "value" : "חזוי: %1$@\nבפועל: %2$@ (%3$@)" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Gestisci le autorizzazioni in Impostazioni" + "value" : "Previsto: %1$@\nEffettivo: %2$@ (%3$@)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predicted: %1$@\nActual: %2$@ (%3$@)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Behandle tillatelser i Innstillinger" + "value" : "Forventet: %1$@\nFaktisk: %2$@ ( %3$@ )" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Beheer toestemming in Instellingen" + "value" : "Voorspeld: %1$@\nActueel: %2$@ (%3$@)" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Zarządzaj uprawnieniami w Ustawieniach" + "value" : "Przewidywana: %1$@Rzeczywista: %2$@ (%3$@)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prevista: %1$@\nAtual: %2$@ (%3$@)" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Gestionați permisiunile din Setări" + "value" : "Prognozată: %1$@\nActuală: %2$@ (%3$@)" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Управление разрешениями в настройках" + "value" : "Прогноз: %1$@\nФакт: %2$@ (%3$@)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Förväntat: %1$@\nFaktiskt: %2$@ (%3$@)" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Ayarlarda İzinleri Yönetin" + "value" : "Tahmini: %1$@\nGüncel: %2$@ (%3$@)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Được dự đoán: %1$@\nThực tế: %2$@ (%3$@)" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "在系统设置中配置权限" + "value" : "预测值: %1$@\n实际值: %2$@ (%3$@)" } } } }, - "Manager Identifier" : { - - }, - "Managing Alerts" : { - "comment" : "View title for how mute alerts work", - "extractionState" : "stale", + "prediction-description-integral-retrospective-correction" : { + "comment" : "Format string describing integral retrospective correction. (1: Integral glucose effect)(2: Total glucose effect)", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Administration af advarsler" + "value" : "prediction-description-integral-retrospective-correction" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Verwalten von Warnungen" + "value" : "Integraler Effekt: %1$@ \n Gesamtglukoseeffekt: %2$@" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Integral effect: %1$@\nTotal glucose effect: %2$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Gestion des Alertes" + "value" : "Effet intégral: %1$@\nEffet total sur la glycémie: %2$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Gestione degli avvisi" + "value" : "previsione-descrizione-integrale-correzione-retrospettiva" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Administrere varsler" + "value" : "prediksjon-beskrivelse-integral-retrospektiv-korreksjon" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Waarschuwingen beheren" + "value" : "Integraal effect: %1$@\nTotaal glucose-effect: %2$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Zarządzanie alertami" + "value" : "predykcja-opis-całka-retrospektywna-korekta" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Gestionarea alertelor" + "value" : "Efect integral: %1$@ \nEfect total al glicemiei: %2$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Управление оповещениями" + "value" : "описание прогнозирования с помощью интегральной ретроспективной коррекции" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "管理警报" + "value" : "积分效应: %1$@\n总葡萄糖效应: %2$@" } } } }, - "Manual" : { - - }, - "Manual Dose: %1$@ %2$@" : { - "comment" : "Description of a bolus dose entry (1: value (? if no value) in bold, 2: unit)", + "prediction-description-retrospective-correction" : { + "comment" : "Format string describing retrospective glucose prediction comparison. (1: Predicted glucose)(2: Actual glucose)(3: difference)", + "extractionState" : "manual", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "التوقع: %1$@\nالواقع: %2$@ (%3$@)" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Manuel dosis: %1$@ %2$@" + "value" : "Forventet: %1$@\nFaktisk: %2$@ (%3$@)" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Manuelle Dosis: %1$@ %2$@" + "value" : "Vorhergesagt: %1$@\nAktuell: %2$@ (%3$@)" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predicted: %1$@\nActual: %2$@ (%3$@)" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Dosis manual: %1$@ %2$@" + "value" : "Predicción: %1$@\nActual: %2$@ (%3$@)" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ennustettu: %1$@\nTodellinen: %2$@ (%3$@)" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Dosage manuel : %1$@ %2$@" + "value" : "Prédit : %1$@\nRéel : %2$@ (%3$@)" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "כמות ידנית: %1$@ %2$@" + "value" : "חזוי: %1$@\nבפועל: %2$@ (%3$@)" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Dose manuale: %1$@ %2$@" + "value" : "Previsto: %1$@\nEffettivo: %2$@ (%3$@)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predicted: %1$@\nActual: %2$@ (%3$@)" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Manuell dose: %1$@ %2$@" + "value" : "Forventet: %1$@\nFaktisk: %2$@ ( %3$@ )" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Doseer handmatig: %1$@ %2$@" + "value" : "Voorspeld: %1$@\nActueel: %2$@ (%3$@)" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dawka z pena: %1$@ %2$@" + "value" : "Przewidywana: %1$@Rzeczywista: %2$@ (%3$@)" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prevista: %1$@\nAtual: %2$@ (%3$@)" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Doză manuală: %1$@ %2$@" + "value" : "Prognozată: %1$@\nActuală: %2$@ (%3$@)" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Ручная доза: %1$@ %2$@" + "value" : "Прогноз: %1$@\nФакт: %2$@ (%3$@)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Förväntat: %1$@\nFaktiskt: %2$@ (%3$@)" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Manuel Doz: %1$@ %2$@" + "value" : "Tahmini: %1$@\nGüncel: %2$@ (%3$@)" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Được dự đoán: %1$@\nThực tế: %2$@ (%3$@)" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "手动剂量: %1$@ %2$@" + "value" : "预测值: %1$@\n实际值: %2$@ (%3$@)" } } } }, - "Manual temporary basal in progress. Automatic dosing is disabled." : { - "comment" : "The error message displayed for LoopError.manualTempBasalRunning errors." - }, - "Maximum Basal Rate Per Hour" : { - "comment" : "Details for configuration error when maximum basal rate per hour is missing", + "Preparing Critical Event Logs" : { + "comment" : "Preparing critical event log text", "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Maksimal basalrate pr. time" + "value" : "Forbereder kritiske begivenhedslogs" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Maximale Basalte pro Stunde" + "value" : "Vorbereiten der kritischen Ereignis-Protokolle" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Tasa basal máxima por hora" + "value" : "Preparando registros de eventos críticos" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Valmistellaan tärkeiden tapahtumien lokia" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Débit Basal Maximum par heure" + "value" : "Préparation des journaux d’événements critiques" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בזאלי מקסימלי לשעה" + "value" : "מכין יומן שגיאות קריטיות" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Velocità basale massima all'ora" + "value" : "Preparazione dei registri degli eventi critici in corso" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Maksimal basaldose pr. time" + "value" : "Forbereder logg av kritiske hendelser" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Maximale basaalstand per uur" + "value" : "Kritieke gebeurtenislogboek voorbereiden" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Maksymalna dawka podstawowa na godzinę" + "value" : "Przygotowywanie dzienników zdarzeń krytycznych" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Rata bazală maximă pe oră" + "value" : "Pregătire jurnal de evenimente critice" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Максимальная базальная скорость в час" + "value" : "Подготовка логов критических событий" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Förbereder kritiska händelseloggar" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Saat Başı Maksimum Bazal Oran" + "value" : "Kritik Olay Günlüklerinin Hazırlanması" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "每小时最大基础速率" + "value" : "正在准备关键事件日志" } } } }, - "Maximum Bolus" : { - "comment" : "Details for configuration error when maximum bolus is missing", + "Preset +6 Hours" : { + "comment" : "Title for a section of a screen that shows a comparison of a user's glucose performance during a preset and 6 hours after the preset.", + "isCommentAutoGenerated" : true + }, + "Preset Delivery" : { + + }, + "Preset Disabled" : { + + }, + "Preset Enabled" : { + + }, + "Preset Summary" : { + + }, + "Presets" : { + "comment" : "Presets screen title\nTitle text for button to Preset Settings", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الإعدادات المسبقة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Předvolby" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Maksimal bolus" + "value" : "Forudindstillinger" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Maximaler Bolus" + "value" : "Voreinstellungen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo Máximo" + "value" : "Ajustes preestablecidos" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Suurin sallittu bolus" + "value" : "Esiasetukset" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus Maximum" + "value" : "Préréglages" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בולוס מקסימלי" + "value" : "הגדרות מראש" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Előbeállítások" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo massimo" + "value" : "Preimpostazioni" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "最大ボーラス" + "value" : "プリセット" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Maks bolus" + "value" : "Forhåndsinnstillinger" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Maximale bolus" + "value" : "Programma's" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Maksymalny bolus" + "value" : "Ustawienia wstępne" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus Máximo" + "value" : "Predefinições" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus maxim" + "value" : "Presetări" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Максимальный Болюс" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Maximal bolus" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Maksimum Bolus" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Liều Bolus tối đa" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "最大剂量" - } - } - } - }, - "Maximum Bolus Exceeded" : { - "comment" : "Title for bolus screen warning when max bolus is exceeded", - "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Maksimal bolus overskredet" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Maximaler Bolus überschritten" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bolo máximo excedido" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bolus Maximum atteint" - } - }, - "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "חריגה מבולוס מקסימלי" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bolo massimo superato" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Maksimal bolus overskredet" + "value" : "Пресеты" } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Maximale bolus overschreden" + "value" : "Predvoľby" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Przekroczono maksymalny bolus" + "value" : "Förinställningar" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolusul maxim depășit" + "value" : "Ön Ayarlar" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Превышен максимальный объем болюса" + "value" : "Пресети" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Maksimum Bolus Aşıldı" + "value" : "Cài đặt sẵn" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "超过最大推注量" + "value" : "预设" } } } }, - "Maximum Intensity (Anaerobic)" : { - - }, - "May experience a rise in glucose." : { - - }, - "May experience drops in glucose." : { - - }, - "Meal Bolus" : { - "comment" : "Title for bolus entry screen when also entering carbs", + "Previous day" : { + "comment" : "Accessibility label for the day page button that steps back a day", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "اليوم السابق" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Předchozí den" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Måltidsbolus" + "value" : "Forrige dag" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Mahlzeiten Bolus" + "value" : "Vorheriger Tag" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo de Comida" + "value" : "Día anterior" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ateriabolus" + "value" : "Edellinen päivä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus de repas" + "value" : "Jour précédent" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בולוס לכיסוי ארוחה" + "value" : "היום הקודם" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Előző nap" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Bolo pasto" + "value" : "Giorno precedente" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "前日" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Måltidsbolus" + "value" : "Forrige dag" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Maaltijd bolus" + "value" : "Vorige dag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus Posiłkowy" + "value" : "Poprzedni dzień" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dia anterior" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus pentru masă" + "value" : "Ziua anterioară" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Болюс на еду" + "value" : "Предыдущий день" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predchádzajúci deň" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Måltidsbolus" + "value" : "Föregående dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Yemek Bolusu" + "value" : "Önceki gün" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Попередній день" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ngày trước" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "餐食大剂量" + "value" : "前一天" } } } }, - "Meal Summary" : { - - }, - "Meal Timing" : { - - }, - "Median (line) with 25–75% and 5–95% bands, by time of day." : { - "comment" : "AGP chart explanation" - }, - "Medium Intensity (Aerobic)" : { - - }, - "mg/dL" : { - "comment" : "The short unit display string for milligrams of glucose per decilter", - "extractionState" : "stale", + "Previous period" : { + "comment" : "VoiceOver label for the Trends button that moves back one period", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "الفترة السابقة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Předchozí období" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Forrige periode" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Vorheriger Zeitraum" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Período anterior" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Edellinen jakso" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Période précédente" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "התקופה הקודמת" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Előző időszak" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Periodo precedente" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "前の期間" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Forrige periode" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Vorige periode" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dl" + "value" : "Poprzedni okres" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Período anterior" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Perioada anterioară" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "мг/дл" + "value" : "Предыдущий период" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Predchádzajúce obdobie" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dl" + "value" : "Föregående period" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Önceki dönem" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Попередній період" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "Khoảng thời gian trước" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "mg/dL" + "value" : "上一时段" } } } }, - "Missed Meal Notifications" : { - "comment" : "Title for missed meal notifications toggle", + "Primed" : { + "comment" : "Pump event in the history: the pump primed the tubing or cannula", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تمت التعبئة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Naplněno" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Meddelelser om glemt måltid" + "value" : "Fyldt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Verpasste Mahlzeit Benachrichtigung" + "value" : "Gefüllt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cebado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Täytetty" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Notifications de repas manqués" + "value" : "Amorcé" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "התראה על ארוחות שלא הוזנו" + "value" : "בוצע תיחול" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Feltöltve" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Notifiche di pasti mancati" + "value" : "Caricamento eseguito" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "プライミング" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Varsler om tapte måltider" + "value" : "Fylt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Gemiste maaltijdmeldingen" + "value" : "Gevuld" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Powiadomienia o pominiętych posiłkach" + "value" : "Napełniono" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preenchido" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Notificări mese neanunțate" + "value" : "Amorsat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Уведомления о пропущенных приемах пищи" + "value" : "Заполнение выполнено" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Naplnené" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Primning klar" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kaçırılan Yemek Bildirimleri" + "value" : "Dolum yapıldı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Заповнення виконано" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã mồi" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "错过用餐通知" + "value" : "已充注" } } } }, - "Missing data: %1$@" : { - "comment" : "The error message for missing data. (1: missing data details)", + "Projected" : { + "comment" : "Chart legend: dashed lines show Loop's projection of insulin and carbs on board", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "بيانات مفقودة: %1$@" + "value" : "المتوقع" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Předpověď" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Manglende data: %1$@" + "value" : "Forventet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Fehlende Daten: %1$@" + "value" : "Prognose" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Faltan Datos: %1$@" + "value" : "Proyectado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Tiedot puuttuvat: %1$@" + "value" : "Ennuste" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Données manquantes: %1$@" + "value" : "Projeté" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "נתונים חסרים: %1$@" + "value" : "צפי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Előrevetített" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Dati mancanti: %1$@" + "value" : "Previsto" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "データがありません: %1$@" + "value" : "予測" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Manglende data: %1$@" + "value" : "Beregnet" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ontbrekende gegevens: %1$@" + "value" : "Verwacht" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Brakujące dane: %1$@" + "value" : "Prognozowane" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Dados ausentes: %1$@" + "value" : "Projetado" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Date lipsă: %1$@" + "value" : "Proiectat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Пропущены данные: %1$@" + "value" : "Прогнозируемые" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Predpoveď" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Saknar data: %1$@" + "value" : "Prognos" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Eksik veri: %1$@" + "value" : "Öngörülen" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прогнозовані" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Dữ liệu thiếu: %1$@" + "value" : "Dự kiến" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "数据缺失: %1$@" + "value" : "预计" } } } }, - "Missing maximum allowed bolus in settings" : { - "comment" : "Bolus error description: missing maximum bolus in settings.", + "Pump alarm" : { + "comment" : "Pump event in the history: an alarm whose pump gave no title", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إنذار المضخة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alarm pumpy" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Manglende maksimalt tilladt bolus i indstillingerne" + "value" : "Pumpealarm" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Maximal erlaubter Bolus in den Einstellungen fehlt" + "value" : "Pumpenalarm" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Falta el bolo máximo permitido en la configuración" + "value" : "Alarma de la microinfusadora" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpun hälytys" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus maximal autorisé manquant dans les paramètres" + "value" : "Alarme de la pompe" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "בולוס מקסימלי חסר בהגדרות" + "value" : "התראת משאבה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpariasztás" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Manca il bolo massimo consentito nelle impostazioni" + "value" : "Allarme pompa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ポンプアラーム" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Mangler maksimalt tillatt bolus i innstillingene" + "value" : "Pumpealarm" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Maximaal toegestane bolus ontbreekt in instellingen" + "value" : "Pompalarm" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Brak ustawionego maksymalnego dozwolonego bolusa" + "value" : "Alarm pompy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alarme da bomba" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Lipsește bolusul maxim permis în setări" + "value" : "Alarmă pompă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Отсутствие максимально допустимого болюса в настройках" + "value" : "Тревога помпы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alarm pumpy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumplarm" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Ayarlarda izin verilen maksimum bolus eksik" + "value" : "Pompa alarmı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тривога помпи" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cảnh báo bơm" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "设置中缺少最大剂量限制" + "value" : "胰岛素泵警报" } } } }, - "Mixed-intensity exercise may cause only small changes in glucose levels. Your glucose may go up or down." : { - - }, - "mmol/L" : { - "comment" : "The short unit display string for millimoles of glucose per liter", - "extractionState" : "stale", + "Pump data too old" : { + "comment" : "Reason Loop could not run: the latest pump data was too old", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "بيانات المضخة قديمة جدًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Data pumpy jsou příliš stará" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Pumpedata for gamle" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Pumpendaten zu alt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Datos de la microinfusadora demasiado antiguos" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Pumpun tiedot liian vanhoja" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Données de la pompe trop anciennes" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "נתוני המשאבה ישנים מדי" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Túl régi pumpaadatok" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Dati pompa troppo vecchi" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "ポンプデータが古すぎます" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Pumpedata for gamle" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Pompgegevens te oud" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Dane pompy zbyt stare" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Dados da bomba muito antigos" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Date pompă prea vechi" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "ммоль/л" + "value" : "Данные помпы устарели" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Údaje pumpy sú príliš staré" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" + "value" : "Pumpdata för gamla" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "mmol/L" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "mmol/L" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "mmol/L" - } - } - } - }, - "Mode" : { - "comment" : "Title for mode live activity toggle", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modus" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mode" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modus" + "value" : "Pompa verisi çok eski" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Modus" + "value" : "Дані помпи застаріли" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Mod" + "value" : "Dữ liệu bơm quá cũ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "模式" + "value" : "胰岛素泵数据过旧" } } } }, - "Momentum effects" : { - "comment" : "Details for missing data error when momentum effects are missing", + "Pump manager error" : { + "comment" : "Reason Loop could not run: the pump reported an error", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تأثيرات النشاط" + "value" : "خطأ في مدير المضخة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba správce pumpy" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Momentumeffekter" + "value" : "Pumpefejl" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Momentum-Effekte" + "value" : "Pumpenfehler" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Efectos de Momento" + "value" : "Error del gestor de la microinfusadora" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Liikevaikutukset (momentum)" + "value" : "Pumpunhallinnan virhe" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Effets de momentum" + "value" : "Erreur du gestionnaire de pompe" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "השפעות מומנטום" + "value" : "שגיאת מנהל המשאבה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpakezelő-hiba" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Effetti del momento" + "value" : "Errore del gestore pompa" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "モメンタム効果" + "value" : "ポンプマネージャのエラー" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Momentum effekter" + "value" : "Pumpefeil" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Trendlijneffecten" + "value" : "Pompfout" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "wpływ pędu" + "value" : "Błąd menedżera pompy" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Efeitos de aceleração" + "value" : "Erro do gerenciador da bomba" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Efecte avânt" + "value" : "Eroare manager pompă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Влияние динамики СК" + "value" : "Ошибка менеджера помпы" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba správcu pumpy" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Momentumeffekter" + "value" : "Fel i pumphanteraren" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Momentum etkileri" + "value" : "Pompa yöneticisi hatası" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Помилка менеджера помпи" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Hiệu ứng động lượng" + "value" : "Lỗi trình quản lý bơm" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "葡萄糖动量效应" + "value" : "胰岛素泵管理器错误" } } } }, - "Monitor your glucose and active insulin at the start of a competition day" : { - - }, - "More Info" : { - "comment" : "Text for more info action on notification of upcoming TestFlight expiration\nText for more info action on notification of upcoming profile expiration", + "Pump suspended" : { + "comment" : "Reason Loop could not run: insulin delivery on the pump was suspended", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المضخة متوقفة مؤقتًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpa pozastavena" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Mere Info" + "value" : "Pumpe suspenderet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Weitere Info" + "value" : "Pumpe unterbrochen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Más Info" + "value" : "Microinfusadora suspendida" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Lisätietoa" + "value" : "Pumppu pysäytetty" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Plus d'informations" + "value" : "Pompe suspendue" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מידע נוסף" + "value" : "המשאבה מושהית" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpa felfüggesztve" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Ulteriori informazioni" + "value" : "Pompa sospesa" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "詳細" + "value" : "ポンプ一時停止中" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Mer info" + "value" : "Pumpe stanset" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Meer informatie" + "value" : "Pomp onderbroken" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Więcej informacji" + "value" : "Pompa wstrzymana" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Mais Info" + "value" : "Bomba suspensa" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Detalii" + "value" : "Pompă suspendată" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Доп. инфо" + "value" : "Помпа приостановлена" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpa pozastavená" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Mer info" + "value" : "Pump pausad" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Daha fazla bilgi" + "value" : "Pompa askıya alındı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Помпу призупинено" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Thêm thông tin" + "value" : "Bơm đã tạm ngưng" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "更多信息" + "value" : "胰岛素泵已暂停" } } } }, - "Morning Exercise" : { - - }, - "Morning exercise before eating (like a fasted jog) usually causes a smaller drop in glucose levels and may even promote a rise, compared to afternoon exercise." : { - - }, - "Mutable" : { - - }, - "Mute All Alerts" : { - "comment" : "Label for button to mute all alerts", - "extractionState" : "stale", + "Readings" : { + "comment" : "Chart legend on the Now screen: dots are CGM glucose readings", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Slå alle alarmer fra" + "value" : "القراءات" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Alle Alarme stummschalten" + "value" : "Hodnoty" } }, - "es" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Silenciar todas las alertas" + "value" : "Målinger" } }, - "fr" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Enlever le son de toutes les alertes" + "value" : "Messwerte" } }, - "he" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "השתק את כל ההתראות" + "value" : "Lecturas" } }, - "it" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Disattiva tutti gli avvisi" + "value" : "Lukemat" } }, - "nb" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Demp alle varsler" + "value" : "Mesures" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קריאות" } }, - "nl" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Alle waarschuwingen dempen" + "value" : "Mért értékek" } }, - "pl" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Wycisz wszystkie alerty" + "value" : "Letture" } }, - "ro" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Dezactivați toate alertele" + "value" : "測定値" } }, - "ru" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Выключить все оповещения" + "value" : "Målinger" } }, - "tr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Tüm Uyarıları Sessize Al" + "value" : "Waarden" } }, - "zh-Hans" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "静音所有警报" + "value" : "Odczyty" } - } - } - }, - "Mute All Alerts Temporarily" : { - "comment" : "Title for mute alert duration selection action sheet", - "extractionState" : "stale", - "localizations" : { - "da" : { + }, + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Slå lyden fra for alle advarsler midlertidigt" + "value" : "Leituras" } }, - "de" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Alle Warnungen vorübergehend stummschalten" + "value" : "Citiri" } }, - "fr" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Désactiver temporairement toutes les alertes" + "value" : "Показания" } }, - "it" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Disattiva temporaneamente tutti gli avvisi" + "value" : "Hodnoty" } }, - "nb" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Slå av alle varsler midlertidig" + "value" : "Värden" } }, - "nl" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Alle waarschuwingen tijdelijk dempen" + "value" : "Okumalar" } }, - "pl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Tymczasowo wycisz wszystkie alerty" + "value" : "Показники" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Dezactivați temporar toate alertele" + "value" : "Chỉ số" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "暂时静音所有警报" + "value" : "读数" } } } }, - "Mute All App Sounds" : { - "comment" : "Label for button to mute all app sounds" - }, - "Muted until" : { - "comment" : "Label for when mute alert will end" - }, - "Name" : { - "comment" : "Label for name row on add favorite food screen\nPreset sorting option description for sorting by name", + "Recent readings unavailable: %1$@" : { + "comment" : "Error under the prediction chart on the Now screen. (1: system error description)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "الاسم" + "value" : "القراءات الأخيرة غير متاحة: %1$@" } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Název" + "value" : "Nedávné hodnoty nejsou k dispozici: %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Navn" + "value" : "Seneste målinger ikke tilgængelige: %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Name" + "value" : "Aktuelle Messwerte nicht verfügbar: %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Nombre" + "value" : "Lecturas recientes no disponibles: %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Nimi" + "value" : "Viimeisimmät lukemat eivät saatavilla: %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Nom" + "value" : "Mesures récentes indisponibles : %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "שם" + "value" : "קריאות אחרונות אינן זמינות: %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A legutóbbi értékek nem érhetők el: %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nome" + "value" : "Letture recenti non disponibili: %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "プリセット名" + "value" : "最近の測定値を取得できません:%1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Navn" + "value" : "Nylige målinger ikke tilgjengelige: %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Naam" + "value" : "Recente waarden niet beschikbaar: %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nazwa" + "value" : "Ostatnie odczyty niedostępne: %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Nome" + "value" : "Leituras recentes indisponíveis: %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nume" + "value" : "Citiri recente indisponibile: %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Имя" + "value" : "Последние показания недоступны: %1$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Názov" + "value" : "Nedávne hodnoty nie sú k dispozícii: %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Namn" + "value" : "Senaste värden ej tillgängliga: %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İsim" + "value" : "Son okumalar kullanılamıyor: %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Останні показники недоступні: %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Tên" + "value" : "Không có chỉ số gần đây: %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "名称" + "value" : "最近读数不可用:%1$@" } } } }, - "Needs Attention" : { - "comment" : "Sensor state description for the non-valid state", - "extractionState" : "manual", + "Recommendation expired" : { + "comment" : "Reason Loop could not run: its dosing recommendation expired before it was used", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "انتهت صلاحية التوصية" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Doporučení vypršelo" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Handling påkrævet" + "value" : "Anbefaling udløbet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Erfordert Aufmerksamkeit" + "value" : "Empfehlung abgelaufen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Necesita Atención" + "value" : "Recomendación caducada" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Tarvitsee huomiota" + "value" : "Suositus vanhentunut" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Demande votre attention" + "value" : "Recommandation expirée" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "דורש תשומת לב" + "value" : "תוקף ההמלצה פג" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lejárt javaslat" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Richiede attenzione" + "value" : "Suggerimento scaduto" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "注意してください" + "value" : "推奨の有効期限切れ" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Trenger tilsyn" + "value" : "Anbefaling utløpt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Aandacht nodig" + "value" : "Advies verlopen" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Potrzebuje uwagi" + "value" : "Zalecenie wygasło" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Precisa de Atenção" + "value" : "Recomendação expirada" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Necesită atenție" + "value" : "Recomandare expirată" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Требует внимания" + "value" : "Рекомендация устарела" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odporúčanie vypršalo" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Kräver uppmärksamhet" + "value" : "Rekommendationen har gått ut" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "İlgilenmeniz gerekiyor" + "value" : "Önerinin süresi doldu" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Рекомендація застаріла" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Cần chú ý" + "value" : "Khuyến nghị đã hết hạn" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "请注意" + "value" : "建议已过期" } } } }, - "Negative duration not allowed" : { - "comment" : "Override error description: negative duration error.", + "Reservoir changed" : { + "comment" : "Pump event in the history: the insulin reservoir was replaced", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تم تغيير الخزان" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zásobník vyměněn" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Negativ varighed ikke tilladt" + "value" : "Reservoir skiftet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Eine negative Dauer ist nicht erlaubt" + "value" : "Reservoir gewechselt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reservorio cambiado" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Säiliö vaihdettu" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Durée négative non autorisée" + "value" : "Réservoir changé" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "משך זמן שלילי לא מותר" + "value" : "המאגר הוחלף" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tartály cserélve" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Durata negativa non consentita" + "value" : "Serbatoio cambiato" } }, - "nb" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Negativ varighet ikke tillatt" + "value" : "リザーバ交換" } }, - "nl" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Negatieve duur niet toegestaan" + "value" : "Reservoar byttet" } }, - "pl" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Ujemny czas trwania nie jest dozwolony" + "value" : "Reservoir vervangen" } }, - "ro" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Durata negativă nu este permisă" + "value" : "Wymieniono zbiorniczek" } }, - "ru" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Отрицательная продолжительность не допускается" + "value" : "Reservatório trocado" } }, - "tr" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Negatif süreye izin verilmez" + "value" : "Rezervor schimbat" } }, - "zh-Hans" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "不允许出现负时长" + "value" : "Резервуар заменён" } - } - } - }, - "New Favorite Food" : { - "comment" : "Title of new favorite food screen", - "localizations" : { - "de" : { + }, + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Neues Lieblingsessen" + "value" : "Zásobník vymenený" } }, - "fr" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Nouvel aliment préféré" + "value" : "Reservoar bytt" } }, - "nb" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Ny favorittmat" + "value" : "Rezervuar değiştirildi" } }, - "nl" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Nieuw favoriet voedingsmiddel" + "value" : "Резервуар замінено" } }, - "ro" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Noua mâncare preferată" + "value" : "Đã thay bình chứa" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "新增常用食物" + "value" : "已更换储药器" } } } }, - "Next, we’ll look at settings you can change and how they affect Omar’s insulin." : { - - }, - "Next, we’ll look at settings you can change and how they affect Paloma’s insulin." : { - - }, - "Nightscout" : { - "comment" : "The title of the Nightscout service", - "extractionState" : "manual", + "Reservoir rewound" : { + "comment" : "Pump event in the history: the pump rewound its reservoir", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "نايتسكاوت" + "value" : "تم إرجاع الخزان" } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Zásobník převinut" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Reservoir spolet tilbage" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nightscout" + "value" : "Reservoir zurückgespult" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Reservorio rebobinado" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Säiliö kelattu taakse" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Réservoir rembobiné" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "המאגר הוחזר לאחור" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tartály visszatekerve" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Serbatoio riavvolto" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "リザーバ巻き戻し" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Reservoar spolt tilbake" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Reservoir teruggespoeld" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Cofnięto tłok zbiorniczka" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Reservatório rebobinado" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Rezervor rebobinat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Резервуар перемотан" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Zásobník pretočený" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Reservoar tillbakaspolad" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Rezervuar geri sarıldı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Резервуар перемотано" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "Đã tua lại bình chứa" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Nightscout" + "value" : "储药器已回位" } } } }, - "No" : { - - }, - "No Activity" : { - - }, - "No alerts or alarms will sound while muted. Select how long you would you like to mute for." : { - "comment" : "Message for mute alert duration selection action sheet", - "extractionState" : "stale", + "Scheduled basal only" : { + "comment" : "Logbook day where only the scheduled basal ran, with nothing else logged", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen advarsler eller alarmer lyder, mens lyden er slået fra. Vælg, hvor længe du vil slå lyden fra." + "value" : "القاعدية المجدولة فقط" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Bei Stummschaltung ertönen keine Warn- oder Alarmsignale. Wähle die Dauer der Stummschaltung aus." + "value" : "Jen plánovaný bazál" } }, - "fr" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Aucune alerte ni alarme auditive ne sera émise lorsque le mode silencieux est activé. Choisissez la durée du mode silencieux." + "value" : "Kun planlagt basal" } }, - "it" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Nessun avviso o allarme suonerà quando l'audio è disattivato. Seleziona per quanto tempo desideri disattivare l'audio." + "value" : "Nur geplante Basalrate" } }, - "nb" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen varsler eller alarmer vil høres mens de er dempet. Velg hvor lenge du ønsker å dempe lyden." + "value" : "Solo basal programada" } }, - "nl" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Zolang dempen aan staat, klinken er geen waarschuwingen of alarmen. Kies hoe lang je wilt dempen." + "value" : "Vain ohjelmoitu basaali" } }, - "pl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Po wyciszeniu nie będą emitowane żadne alerty ani alarmy. Wybierz, jak długo chcesz wyciszyć." + "value" : "Basal programmé uniquement" } }, - "ro" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Nicio alertă nu va suna când este dezactivat sunetul. Odată ce această perioadă se încheie, alertele și alarmele dumneavoastră vor relua normal." + "value" : "Basal מתוזמן בלבד" } }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "静音期间所有提醒与告警都不会发出声音。请选择你希望保持静音的时长。" - } - } - } - }, - "No Bolus Recommended" : { - "comment" : "Title for bolus screen notice when no bolus is recommended\nTitle for bolus screen warning when glucose is below suspend threshold, and a bolus is not recommended\nTitle for bolus screen warning when no bolus is recommended", - "localizations" : { - "da" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen bolus anbefalet" + "value" : "Csak ütemezett basal" } }, - "de" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Kein Bolus empfohlen" + "value" : "Solo basale programmata" } }, - "es" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "No hay bolo recomendado" + "value" : "スケジュールのベーサルのみ" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Bolusta ei suositella" + "value" : "Bare planlagt basal" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Aucun Bolus Recommandé" + "value" : "Alleen gepland basaal" } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "אין המלצה לבולוס" + "value" : "Tylko zaplanowana baza" } }, - "it" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Nessun bolo consigliato" + "value" : "Somente basal programada" } }, - "nb" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen anbefalt bolus" + "value" : "Doar bazala programată" } }, - "nl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Geen bolus aanbevolen" + "value" : "Только базал по расписанию" } }, - "pl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus nie jest zalecany" + "value" : "Len plánovaný bazál" } }, - "ro" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Niciun bolus recomandat" + "value" : "Endast schemalagd basal" } }, - "ru" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Нет рекомендации болюса" + "value" : "Yalnızca planlanan bazal" } }, - "sv" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen bolus rekommenderas" + "value" : "Лише базал за розкладом" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bolus Önerilmez" + "value" : "Chỉ Basal theo lịch" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "没有推荐的餐前剂量" + "value" : "仅预设基础率" } } } }, - "No change in glucose." : { - - }, - "no change needed" : { - - }, - "No connected devices, or failure during device connection" : { - "comment" : "The error message displayed for device connection errors.", + "SD %1$@ · CV %2$@%%" : { + "comment" : "Trends Average tile detail: standard deviation and coefficient of variation of glucose. (1: standard deviation in the glucose unit, 2: coefficient of variation as a percentage number)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "لا يوجد أجهزة متصلة, أو يوجد خطأ أثناء الاتصال" + "value" : "SD %1$@ · CV %2$@%%" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "SD %1$@ · CV %2$@%%" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen tilsluttede enheder eller fejl under forbindelse til enhed" + "value" : "SD %1$@ · CV %2$@ %%" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Keine verbundenen Geräte oder Fehler während der Geräteverbindung" + "value" : "SD %1$@ · VK %2$@ %%" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "No hay dispositivos conectados o falla durante conexión de dispositivo" + "value" : "DE %1$@ · CV %2$@%%" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ei yhdistettyjä laitteita tai häiriö laiteyhteydessä" + "value" : "SD %1$@ · CV %2$@ %%" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Pas d'appareil connecté, ou échec durant la connexion à l'appareil" + "value" : "ET %1$@ · CV %2$@ %%" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "אין מכשירים מחוברים, או שישנה שגיאת התחברות." + "value" : "SD %1$@ · CV %2$@%%" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "SD %1$@ · CV %2$@%%" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nessun dispositivo connesso o mancanza di segnale durante la connessione del dispositivo" + "value" : "DS %1$@ · CV %2$@%%" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "機器が未接続、または接続に問題" + "value" : "SD %1$@ · CV %2$@%%" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen tilkoblede enheter, eller feil under enhetstilkobling" + "value" : "SD %1$@ · CV %2$@ %%" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Geen aangesloten apparaten of storingen tijdens het verbinden met het apparaat" + "value" : "SD %1$@ · CV %2$@%%" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Brak podłączonych urządzeń lub awaria podczas połączenia urządzenia" + "value" : "SD %1$@ · CV %2$@%%" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Nenhum dispositivo conectado ou falha durante a conexão" + "value" : "DP %1$@ · CV %2$@%%" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nu este conectat niciun dispozitiv sau s-a produs o eroare la conectare" + "value" : "SD %1$@ · CV %2$@%%" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Устройства не сопряжены или произошла ошибка во время сопряжения" + "value" : "SD %1$@ · CV %2$@%%" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "SD %1$@ · CV %2$@%%" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen ansluten enhet, eller fel vid anslutning till enhet" + "value" : "SD %1$@ · CV %2$@ %%" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Bağlı cihaz yok veya cihaz bağlantısı sırasında hata" + "value" : "SD %1$@ · CV %%%2$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "SD %1$@ · CV %2$@%%" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Không có thiết bị nào được kết nối, hoặc lỗi trong quá trình kết nối" + "value" : "SD %1$@ · CV %2$@%%" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "没有连接的设备,或设备连接期间发生故障" + "value" : "SD %1$@ · CV %2$@%%" } } } }, - "No Delivery" : { - - }, - "No glucose data for this period." : { - "comment" : "Statistics empty state" - }, - "No Maximum Bolus Configured" : { - "comment" : "Alert title for a missing maximum bolus setting error", + "Sets up a CGM" : { + "comment" : "VoiceOver hint for the Add CGM status pill on the Now screen", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يُعدّ جهاز CGM" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastaví CGM" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen maksimal bolus konfigureret" + "value" : "Opsætter en CGM" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kein maximaler Bolus konfiguriert" + "value" : "Richtet ein CGM ein" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "No hay bolo máximo configurado" + "value" : "Configura un CGM" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Maksimibolusta ei ole määritetty" + "value" : "Ottaa CGM:n käyttöön" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Aucun Bolus Maximum configuré" + "value" : "Configure un CGM" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "לא הוגדר בולוס מקסימלי" + "value" : "מגדיר CGM" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGM beállítása" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nessun bolo massimo configurato" + "value" : "Configura un CGM" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CGMを設定します" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen maksimal bolus er konfigurert" + "value" : "Setter opp en CGM" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Geen maximale bolus geconfigureerd" + "value" : "Stelt een CGM in" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nie skonfigurowano maksymalnego bolusa" + "value" : "Konfiguruje CGM" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configura um CGM" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Bolusul maxim nu este setat" + "value" : "Configurează un CGM" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Не установлен максимальный болюс" + "value" : "Настраивает CGM" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastaví CGM" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen maximal bolus har blivit inställd" + "value" : "Lägger till en CGM" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Yapılandırılmış Maksimum Bolus Yok" + "value" : "CGM kurar" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Налаштовує CGM" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thiết lập CGM" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "没有设置最大推注量" + "value" : "设置 CGM" } } } }, - "No performance history available yet" : { - - }, - "No Pump Configured" : { - "comment" : "Alert title for a missing pump error", + "Sets up a pump" : { + "comment" : "VoiceOver hint for the Add pump status pill on the Now screen", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يُعدّ مضخة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastaví pumpu" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen pumpe konfigureret" + "value" : "Opsætter en pumpe" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Keine Pumpe konfiguriert" + "value" : "Richtet eine Pumpe ein" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "No hay microinfusadora configurada" + "value" : "Configura una microinfusadora" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Pumppua ei ole määritetty" + "value" : "Ottaa pumpun käyttöön" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Pas de pompe configurée" + "value" : "Configure une pompe" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "לא הוגדרה משאבה" + "value" : "מגדיר משאבה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpa beállítása" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nessuna pompa configurata" + "value" : "Configura una pompa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ポンプを設定します" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen pumpe er konfigurert" + "value" : "Setter opp en pumpe" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Geen pomp geconfigureerd" + "value" : "Stelt een pomp in" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nie skonfigurowano pompy" + "value" : "Konfiguruje pompę" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configura uma bomba" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nicio pompă configurată" + "value" : "Configurează o pompă" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Нет настроенной помпы" + "value" : "Настраивает помпу" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastaví pumpu" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägger till en pump" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pompa kurar" } }, - "sv" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen pump konfigurerad" + "value" : "Налаштовує помпу" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Yapılandırılmış Pompa Yok" + "value" : "Thiết lập bơm" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "未配置泵" + "value" : "设置胰岛素泵" } } } }, - "No Recent Glucose" : { - "comment" : "The title of the cell indicating that there is no recent glucose", - "extractionState" : "stale", + "Shows when Loop last ran" : { + "comment" : "VoiceOver hint for the Loop status pill and the Loop notice on the Now screen", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "يعرض آخر مرة عمل فيها Loop" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ukáže, kdy Loop naposledy proběhl" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen nyere glukose" + "value" : "Viser, hvornår Loop sidst kørte" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kein aktueller Blutzucker " + "value" : "Zeigt, wann Loop zuletzt gelaufen ist" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Sin glucosa reciente" + "value" : "Muestra cuándo se ejecutó Loop por última vez" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ei viimeaikaisia glukoositietoja" + "value" : "Näyttää, milloin Loop ajettiin viimeksi" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Pas de Glycémie récente" + "value" : "Indique la dernière exécution de Loop" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "אין גלוקוז לאחרונה" + "value" : "מציג מתי Loop רץ לאחרונה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Megmutatja, mikor futott utoljára a Loop" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nessuna glicemia recente" + "value" : "Mostra l'ultima esecuzione di Loop" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Loopの最終実行時刻を表示します" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen ny blodsukkermåling" + "value" : "Viser når Loop sist kjørte" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Geen recente glucose" + "value" : "Toont wanneer Loop voor het laatst draaide" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Brak aktualnej glukozy" + "value" : "Pokazuje, kiedy Loop ostatnio działał" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mostra quando o Loop executou pela última vez" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Lipsă glicemie recentă" + "value" : "Arată când a rulat Loop ultima dată" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Нет актуальных данных о глюкозе" + "value" : "Показывает, когда Loop запускался последний раз" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ukáže, kedy Loop naposledy prebehol" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Inga senaste blodglukosvärde" + "value" : "Visar när Loop senast kördes" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Son KŞ Yok" + "value" : "Loop'un son çalıştığı zamanı gösterir" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Показує, коли Loop запускався востаннє" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiển thị lần chạy gần nhất của Loop" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无近期血糖数据" + "value" : "显示 Loop 上次运行时间" } } } }, - "No Recent Glucose Data" : { - "comment" : "Title for bolus screen notice when glucose data is missing or stale", + "Summary" : { + "comment" : "Trends card title: the summary statistics tiles", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الملخص" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Souhrn" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen nylige glukosedata" + "value" : "Oversigt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Kein aktueller Blutzucker " + "value" : "Übersicht" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Sin datos de glucosa recientes" + "value" : "Resumen" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ei viimeaikaisia glukoositietoja" + "value" : "Yhteenveto" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Pas de Glycémie récente" + "value" : "Résumé" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "אין נתוני גלוקוז אחרונים" + "value" : "סיכום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Összegzés" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nessun dato recente sulla glicemia" + "value" : "Riepilogo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "概要" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen nye blodsukkerdata" + "value" : "Oversikt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Geen recente glucosegegevens" + "value" : "Overzicht" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Brak ostatnich danych dotyczących glukozy" + "value" : "Podsumowanie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Resumo" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Lipsă date recente glicemie" + "value" : "Rezumat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Нет актуальных данных о глюкозе" + "value" : "Сводка" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Súhrn" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Inget aktuellt blodsockervärde" + "value" : "Sammanfattning" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Son KŞ Verisi Yok" + "value" : "Özet" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Підсумок" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tóm tắt" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无近期血糖数据记录" + "value" : "摘要" } } } }, - "No Recent Pump Data" : { - "comment" : "Title for bolus screen notice when pump data is missing or stale", + "Suspended" : { + "comment" : "Chart callout value: insulin delivery was suspended at the touched time Shown in the Basal tile on the Now screen when insulin delivery is suspended", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "متوقف مؤقتًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pozastaveno" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen nyere pumpedata" + "value" : "Suspenderet" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Keine Pumpendaten" + "value" : "Unterbrochen" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Sin datos de microinfusora recientes" + "value" : "Suspendida" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ei viimeaikaisia pumpun tietoja" + "value" : "Pysäytetty" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Aucune donnée de pompe récente" + "value" : "Suspendu" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "אין נתוני משאבה אחרונים" + "value" : "מושהה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Felfüggesztve" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nessun dato recente sulla pompa" + "value" : "Sospesa" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "一時停止中" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Mangler relevant pumpdata" + "value" : "Stanset" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Geen recente pompgegevens" + "value" : "Onderbroken" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Brak ostatnich danych pompy" + "value" : "Wstrzymano" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suspensa" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Lipsă date recente pompă" + "value" : "Suspendat" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Нет актуальных данных от помпы" + "value" : "Приостановлено" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pozastavené" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Det finns inga aktuella pumpdata" + "value" : "Pausad" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Son Pompa Verisi Yok" + "value" : "Askıya alındı" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Призупинено" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã tạm ngưng" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "没有最近的泵数据" + "value" : "已暂停" } } } }, - "No, edit amount" : { - "comment" : "The title of the action used when rejecting the the amount of carbohydrates entered.", + "System" : { + "comment" : "Appearance option that follows the iPhone's light or dark setting", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "النظام" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Systém" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Nej, indstil mængde" + "value" : "System" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Nein, Menge bearbeiten" + "value" : "System" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "No, editar cantidad" + "value" : "Sistema" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Järjestelmä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Non, modifier la quantité" + "value" : "Système" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "לא, ערוך כמות" + "value" : "מערכת" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rendszer" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "No, modifica la quantità" + "value" : "Sistema" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "システム" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Nei, rediger mengde" + "value" : "System" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Nee, hoeveelheid aanpassen" + "value" : "Systeem" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Nie, edytuj ilość" + "value" : "Systemowy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sistema" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nu, modificați cantitatea" + "value" : "Sistem" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Нет, редактировать сумму" + "value" : "Как в системе" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Systém" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "System" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Hayır, miktarı düzenle" + "value" : "Sistem" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Як у системі" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hệ thống" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "不,修改含量" + "value" : "系统" } } } }, - "None" : { - "comment" : "Indicates no favorite food is selected", + "System follows your iPhone's light or dark setting." : { + "comment" : "Footer for the appearance choice", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "None" + "value" : "خيار النظام يتبع إعداد المظهر الفاتح أو الداكن في iPhone." } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Žádný" + "value" : "Systém se řídí světlým nebo tmavým nastavením iPhonu." } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen" + "value" : "System følger din iPhones lyse eller mørke indstilling." } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Keiner" + "value" : "„System“ folgt der hellen oder dunklen Einstellung Deines iPhones." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Ninguno" + "value" : "Sistema sigue el ajuste claro u oscuro de tu iPhone." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ei mitään" + "value" : "Järjestelmä seuraa iPhonen vaaleaa tai tummaa asetusta." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Aucun" + "value" : "Système suit le réglage clair ou sombre de votre iPhone." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "None" + "value" : "מערכת פועלת לפי הגדרת המראה הבהיר או הכהה של ה-iPhone." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A Rendszer az iPhone világos vagy sötét beállítását követi." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Nessuno" + "value" : "Sistema segue l'impostazione chiara o scura del tuo iPhone." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "なし" + "value" : "「システム」はiPhoneのライト/ダーク設定に従います。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen" + "value" : "System følger den lyse eller mørke innstillingen på iPhonen din." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Geen" + "value" : "Systeem volgt de lichte of donkere instelling van je iPhone." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Brak" + "value" : "Systemowy wygląd jest zgodny z jasnym lub ciemnym ustawieniem iPhone’a." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Nenhum" + "value" : "Sistema segue o ajuste claro ou escuro do seu iPhone." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Nimic" + "value" : "Sistem urmează setarea luminoasă sau întunecată a iPhone-ului." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Не подан" + "value" : "«Как в системе» следует светлому или тёмному оформлению iPhone." } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Žiadny" + "value" : "Systém sa riadi svetlým alebo tmavým nastavením iPhonu." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Ingen" + "value" : "System följer iPhonens ljusa eller mörka inställning." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Hiçbiri" + "value" : "Sistem, iPhone'unuzun açık veya koyu ayarını izler." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "«Як у системі» відповідає світлому або темному вигляду iPhone." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "None" + "value" : "Hệ thống theo cài đặt sáng hoặc tối của iPhone." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无" + "value" : "“系统”跟随 iPhone 的浅色或深色设置。" } } } }, - "None in last 24 hours" : { - - }, - "Not enough data to plot a profile." : { - "comment" : "AGP empty state" - }, - "Not Set" : { - "comment" : "Health sharing status: not determined" - }, - "Notification Delivery" : { - "comment" : "Notification Delivery Status text", + "Target %1$@–%2$@" : { + "comment" : "Glucose target range on the Now screen hero card. (1: lower bound; 2: upper bound)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الهدف %1$@–%2$@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cíl %1$@–%2$@" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Notifikationsindstillinger" + "value" : "Mål %1$@–%2$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Benachrichtigungszustellung" + "value" : "Ziel %1$@–%2$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Entrega de notificaciones" + "value" : "Objetivo %1$@–%2$@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tavoite %1$@–%2$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Notification de l'administration" + "value" : "Cible %1$@–%2$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "משלוח הודעות" + "value" : "יעד %1$@–%2$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cél %1$@–%2$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Invio delle notifiche" + "value" : "Obiettivo %1$@–%2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "目標 %1$@–%2$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Varslingslevering" + "value" : "Mål %1$@–%2$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Afleveren meldingen" + "value" : "Doel %1$@–%2$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Dostarczanie powiadomień" + "value" : "Cel %1$@–%2$@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alvo %1$@–%2$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Livrare notificare" + "value" : "Țintă %1$@–%2$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Доставка уведомлений" + "value" : "Цель %1$@–%2$@" } }, - "tr" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Bildirim Gönderimi" + "value" : "Cieľ %1$@–%2$@" } }, - "zh-Hans" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "通知推送类型" + "value" : "Mål %1$@–%2$@" } - } - } - }, - "Notification delivery is set to Scheduled Summary in your phone’s settings.\n\nTo avoid delay in receiving notifications from %1$@, we recommend notification delivery be set to Immediate Delivery." : { - "comment" : "Format for Critical Alerts permissions disabled alert body. (1: app name)", - "localizations" : { - "da" : { + }, + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Notifikationer er indstillet til et Planlagt resumé i telefonens indstillinger.\n\nFor at undgå forsinkelser ved modtagelse af notifikarioner fra %1$@ anbefaler vi, at notifikationslevering er indstillet til øjeblikkelig levering." + "value" : "Hedef %1$@–%2$@" } }, - "de" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Die Benachrichtigungszustellung ist in den Einstellungen Deines Telefons auf geplante Zusammenfassung eingestellt.\n\nUm Verzögerungen beim Erhalt von Benachrichtigungen von %1$@ zu vermeiden, empfehlen wir, die Benachrichtigungszustellung auf sofortige Zustellung einzustellen." + "value" : "Ціль %1$@–%2$@" } }, - "es" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "El envío de notificaciones está configurado como Resumen Programado en los ajustes del teléfono.\n\nPara evitar retrasos en la recepción de notificaciones de %1$@, le recomendamos que configure el envío de notificaciones como Entrega inmediata." + "value" : "Mục tiêu %1$@–%2$@" } }, - "fr" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "L'envoi des notifications est réglé sur \"Résumé programmé\" dans les paramètres de votre téléphone.\n\nPour éviter tout retard dans la réception des notifications de %1$@, nous vous recommandons de régler l'envoi des notifications sur \"Envoi immédiat\"." + "value" : "目标 %1$@–%2$@" + } + } + } + }, + "Temp basal" : { + "comment" : "Logbook row title: a temporary basal rate", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "Temp Basal" } }, - "he" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "משלוח התראות מוגדר לסיכום מתוזמן בהגדרות הטלפון שלך. \n\n כדי למנוע עיכוב בקבלת התראות מ- %1$@ , אנו ממליצים להגדיר את משלוח ההתראות למשלוח מיידי." + "value" : "Dočasný bazál" } }, - "it" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "L'invio delle notifiche è impostato su Riepilogo pianificato nelle impostazioni del telefono. \n\nPer evitare ritardi nella ricezione delle notifiche da %1$@ , ti consigliamo di impostare l'invio delle notifiche su Consegna immediata." + "value" : "Midlertidig basal" } }, - "nb" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Varslingslevering er satt til Planlagt sammendrag i telefonens innstillinger. \n\n For å unngå forsinkelser i mottak av varsler fra %1$@ , anbefaler vi at varslingslevering settes til Umiddelbar levering." + "value" : "Temporäre Basalrate" } }, - "nl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "De aflevering van meldingen in de instellingen van je telefoon staat op Gepland overzicht.\n\nOm vertraging bij het ontvangen van meldingen van %1$@ te voorkomen, raden we je aan om de aflevering van meldingen in te stellen op Onmiddellijk afleveren." + "value" : "Basal temporal" } }, - "pl" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Dostarczanie powiadomień jest ustawione na Zaplanowane podsumowanie w ustawieniach telefonu. \n\nAby uniknąć opóźnień w otrzymywaniu powiadomień od %1$@ , zalecamy ustawienie dostarczania powiadomień na Natychmiastowe dostarczanie." + "value" : "Temp Basal" } }, - "ro" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Livrarea notificărilor este setată la Rezumat programat în setările telefonului dumneavoastră. \n\nPentru a evita întârzierea primirii notificărilor de la %1$@, vă recomandăm ca livrarea notificărilor să fie setată la Livrare imediată." + "value" : "Basal temp." } }, - "ru" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "В настройках телефона для доставки уведомлений установлено значение \"Сводка по расписанию\".\n\nЧтобы избежать задержки в получении уведомлений от %1$@, мы рекомендуем установить доставку уведомлений на Немедленную доставку." + "value" : "Temp Basal" } }, - "tr" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Bildirim gönderimi, telefonunuzun ayarlarında Zamanlanmış Özet olarak ayarlanmıştır.\n\n%1$@ adresinden bildirim almakta gecikmeyi önlemek için bildirim gönderimini Anında Gönderim olarak ayarlanmasını öneririz." + "value" : "Temp Basal" } }, - "zh-Hans" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "你的手机设置中,该 App 通知投递方式为定时推送摘要。\n\n为避免接收 %1$@ App 通知出现延迟,建议将通知投递方式改为立即推送。" + "value" : "Basale temporanea" } - } - } - }, - "Notifications" : { - "comment" : "Notifications Status text", - "localizations" : { - "da" : { + }, + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Notifikationer" + "value" : "一時ベーサル" } }, - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Benachrichtigungen" + "value" : "Midlertidig basal" } }, - "es" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Notificaciones" + "value" : "Tijdelijk basaal" } }, - "fr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Notifications" + "value" : "Baza tymczasowa" } }, - "he" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "התראות" + "value" : "Temp Basal" } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Notifiche" + "value" : "Bazală temporară" } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Varsler" + "value" : "Врем. базал" } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Sta meldingen toe" + "value" : "Dočasný bazál" } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Powiadomienia" + "value" : "Temporär basal" } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Notificări" + "value" : "Geçici bazal oranı" } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Уведомления" + "value" : "Тимчасовий базал" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bildirimler" + "value" : "Temp Basal" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "通知" + "value" : "临时基础率" } } } }, - "Notifications Delayed" : { - "comment" : "Scheduled Delivery Enabled alert title", + "The icon couldn't be changed: %@" : { + "comment" : "Error shown when iOS refuses an app icon change", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تعذّر تغيير الأيقونة: %@" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikonu nelze změnit: %@" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Notifikationer forsinkede" + "value" : "Symbolet kunne ikke ændres: %@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Benachrichtigungsverzögerung" + "value" : "Das Symbol konnte nicht geändert werden: %@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Retraso en las notificaciones" + "value" : "No se pudo cambiar el icono: %@" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kuvaketta ei voitu vaihtaa: %@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Notifications retardées" + "value" : "Impossible de changer l'icône : %@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "התראות מתעכבות" + "value" : "לא ניתן היה לשנות את הצלמית: %@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Az ikont nem sikerült módosítani: %@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Notifiche ritardate" + "value" : "Impossibile cambiare l'icona: %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アイコンを変更できませんでした:%@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Varsler forsinket" + "value" : "Symbolet kunne ikke endres: %@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Meldingen vertraagd" + "value" : "Het symbool kan niet worden gewijzigd: %@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Spóźnione Powiadomienia" + "value" : "Nie udało się zmienić ikony: %@" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Não foi possível alterar o ícone: %@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Notificări întârziate" + "value" : "Pictograma nu a putut fi schimbată: %@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Уведомления временно отключены" + "value" : "Не удалось сменить значок: %@" } }, - "tr" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Bildirimler Gecikti" + "value" : "Ikonu nie je možné zmeniť: %@" } }, - "zh-Hans" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "通知延迟" + "value" : "Symbolen kunde inte ändras: %@" } - } - } - }, - "Notifications give you important %1$@ app information without requiring you to open the app." : { - "comment" : "Alert Permissions descriptive text (1: app name)", - "extractionState" : "stale", - "localizations" : { - "da" : { + }, + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Meddelelser giver dig vigtige oplysninger om %1$@-appen uden at du behøver at åbne appen." + "value" : "Simge değiştirilemedi: %@" } }, - "de" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Benachrichtigungen geben Dir wichtige %1$@-App-Informationen, ohne dass Du die App öffnen musst." + "value" : "Не вдалося змінити іконку: %@" } }, - "es" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Las notificaciones te proporcionan información importante sobre la aplicación %1$@ sin que tengas que abrirla." + "value" : "Không thể đổi biểu tượng: %@" } }, - "fr" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Les notifications vous donnent des informations importantes sur l'application %1$@ sans avoir à l'ouvrir." + "value" : "无法更改图标:%@" + } + } + } + }, + "The new interface adds Trends and Logbook tabs. Turn it off to go back to the classic status screen; Settings closes to switch." : { + "comment" : "Footer for the interface choice in settings", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "تضيف الواجهة الجديدة تبويبي الاتجاهات والسجل. أوقفها للعودة إلى شاشة الحالة الكلاسيكية؛ تُغلق الإعدادات للتبديل." } }, - "he" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "התראות מעבירות לך מידע חשוב על האפליקציה %1$@ מבלי לדרוש ממך לפתוח את האפליקציה." + "value" : "Nové rozhraní přidává karty Trendy a Deník. Vypněte ho, chcete-li se vrátit ke klasické obrazovce stavu; Nastavení se pro přepnutí zavře." } }, - "it" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Le notifiche ti forniscono informazioni importanti sull'app %1$@ senza che tu debba aprire l'app." + "value" : "Den nye brugerflade tilføjer fanerne Tendenser og Logbog. Slå den fra for at vende tilbage til den klassiske statusskærm; Indstillinger lukkes for at skifte." } }, - "nb" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Varslinger gir deg viktig %1$@ app informasjon uten at du behøver å åpne appen." + "value" : "Die neue Oberfläche fügt die Tabs Trends und Logbuch hinzu. Schalte sie aus, um zum klassischen Statusbildschirm zurückzukehren; die Einstellungen werden zum Wechseln geschlossen." } }, - "nl" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Meldingen geven je belangrijke %1$@ appinformatie zonder dat je de app hoeft te openen." + "value" : "La nueva interfaz añade las pestañas Tendencias y Registro. Desactívala para volver a la pantalla de estado clásica; Ajustes se cierra para cambiar." } }, - "pl" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Powiadomienia zawierają ważne informacje o aplikacji %1$@ bez konieczności otwierania aplikacji." + "value" : "Uusi käyttöliittymä lisää Trendit- ja Lokikirja-välilehdet. Poista se käytöstä palataksesi perinteiseen tilanäyttöön; Asetukset suljetaan vaihtoa varten." } }, - "ro" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Notificările vă oferă informații importante despre aplicația %1$@ fără a fi necesar să deschideți aplicația." + "value" : "La nouvelle interface ajoute les onglets Tendances et Journal. Désactivez-la pour revenir à l'écran d'état classique ; les Paramètres se ferment pour basculer." } }, - "ru" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "Уведомления предоставляют важную информацию о приложении %1$@, не требуя открытия приложения." + "value" : "הממשק החדש מוסיף לשוניות מגמות ויומן. כבה אותו כדי לחזור למסך הסטטוס הקלאסי; ההגדרות ייסגרו לצורך המעבר." } }, - "tr" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Bildirimler, uygulamayı açmanıza gerek kalmadan size önemli %1$@ uygulama bilgilerini verir." + "value" : "Az új felület Trendek és Napló lapokkal bővül. Kapcsold ki, ha vissza szeretnél térni a klasszikus állapotképernyőhöz; a váltáshoz a Beállítások bezárul." } }, - "zh-Hans" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "通知可在无需打开 %1$@ 应用的情况下,向你提供重要信息。" + "value" : "La nuova interfaccia aggiunge le schede Tendenze e Diario. Disattivala per tornare alla classica schermata di stato; Impostazioni si chiude per cambiare." } - } - } - }, - "Notifications give you important %1$@ app information without requiring you to open the app.\n\nKeep these turned ON in your phone’s settings to ensure you receive %1$@ Notifications, Critical Alerts, and Time Sensitive Notifications." : { - "comment" : "Alert Permissions descriptive text (1: app name)", - "localizations" : { - "da" : { + }, + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Meddelelser giver dig vigtige oplysninger om %1$@-appen, uden at du behøver at åbne appen.\n\nLad dem være aktiveret i telefonens indstillinger for at sikre, at du modtager %1$@-meddelelser, kritiske advarsler og tidsfølsomme meddelelser." + "value" : "新しいインターフェイスではトレンドとログブックのタブが追加されます。オフにすると従来のステータス画面に戻ります。切り替えると設定が閉じます。" } }, - "de" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Benachrichtigungen geben Dir wichtige %1$@ App-Informationen, ohne dass Du die App öffnen musst.\n\nLass diese in den Einstellungen Deines Telefons aktiviert, um sicherzustellen, dass Du %1$@ Benachrichtigungen, kritische Warnungen und zeitkritische Benachrichtigungen erhältst." + "value" : "Det nye grensesnittet legger til fanene Trender og Loggbok. Slå det av for å gå tilbake til den klassiske statusskjermen; Innstillinger lukkes for å bytte." } }, - "es" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Las notificaciones te proporcionan información importante sobre la aplicación %1$@ sin que tengas que abrirla.\n\nManten estas activadas en los ajustes del teléfono para recibir notificaciones %1$@, alertas críticas y notificaciones sensibles al tiempo cuando se entregan." + "value" : "De nieuwe interface voegt de tabbladen Trends en Logboek toe. Zet hem uit om terug te gaan naar het klassieke statusscherm; Instellingen sluit om te wisselen." } }, - "fr" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Les notifications vous donnent des informations importantes sur l’application %1$@ sans que vous ayez à ouvrir l’application.\n\nGardez-les activées dans les paramètres de votre téléphone pour vous assurer de recevoir Notifications, Alertes critiques et Notifications urgentes de %1$@." + "value" : "Nowy interfejs dodaje karty Trendy i Dziennik. Wyłącz go, aby wrócić do klasycznego ekranu stanu; Ustawienia zamkną się, aby przełączyć." } }, - "he" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "התראות מעניקות לך מידע חשוב על %1$@ מבלי לדרוש ממך לפתוח את האפליקציה.\n\nכדי להבטיח שתקבל התראות %1$@, התראות קריטיות והתראות רגישות לזמן, וודא שהן מופעלות." + "value" : "A nova interface adiciona as abas Tendências e Diário. Desligue-a para voltar à tela de status clássica; as Configurações fecham para trocar." } }, - "it" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Le notifiche ti forniscono informazioni importanti sull'app %1$@ senza che tu debba aprire l'app. \n\nTienile attive nelle impostazioni del tuo telefono per assicurarti di ricevere %1$@ notifiche, avvisi critici e notifiche sensibili al tempo." + "value" : "Noua interfață adaugă filele Tendințe și Jurnal. Dezactivați-o pentru a reveni la ecranul de stare clasic; Setările se închid pentru comutare." } }, - "nb" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Varsler gir deg viktig %1$@ appinformasjon uten at du trenger å åpne appen. \n\n Hold disse slått PÅ i telefonens innstillinger for å sikre at du mottar %1$@ -varsler, kritiske varsler og tidssensitive varsler." + "value" : "Новый интерфейс добавляет вкладки «Тренды» и «Журнал». Выключите его, чтобы вернуться к классическому экрану статуса; для переключения настройки закроются." } }, - "nl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Meldingen geven je belangrijke %1$@ appinformatie zonder dat je de app hoeft te openen.\n\nHoud deze instellingen AAN in je telefooninstellingen om ervoor te zorgen dat %1$@ je meldingen, Kritieke meldingen en Tijdgevoelige meldingen ontvangt." + "value" : "Nové rozhranie pridáva karty Trendy a Denník. Vypnite ho, ak sa chcete vrátiť ku klasickej obrazovke stavu; Nastavenia sa pri prepnutí zatvoria." } }, - "pl" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Powiadomienia dostarczają ważnych informacji o aplikacji %1$@ bez konieczności otwierania aplikacji. \n\nWłącz je w ustawieniach telefonu, aby mieć pewność, że będziesz otrzymywać powiadomienia %1$@ , alerty krytyczne i powiadomienia zależne od czasu." + "value" : "Det nya gränssnittet lägger till flikarna Trender och Loggbok. Stäng av det för att gå tillbaka till den klassiska statusskärmen; Inställningar stängs vid bytet." } }, - "ro" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Notificările vă oferă informații importante despre aplicația %1$@ fără a fi necesar să deschideți aplicația. \n\nPăstrați-le activate în setările telefonului pentru a vă asigura că primiți notificări %1$@, alerte critice și notificări urgente." + "value" : "Yeni arayüz Eğilimler ve Kayıt Defteri sekmelerini ekler. Klasik durum ekranına dönmek için kapatın; geçiş için Ayarlar kapanır." } }, - "ru" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Уведомления предоставляют важную информацию о приложении %1$@, не требуя открытия приложения.\n\nВключите их в настройках телефона, чтобы получать уведомления %1$@, критические предупреждения и уведомления, чувствительные к времени." + "value" : "Новий інтерфейс додає вкладки «Тренди» і «Журнал». Вимкніть його, щоб повернутися до класичного екрана стану; для перемикання налаштування закриються." } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Bildirimler, uygulamayı açmanıza gerek kalmadan size önemli %1$@ uygulama bilgilerini verir. \n\n %1$@ Bildirimler, Kritik Uyarılar ve Zamana Duyarlı Bildirimler aldığınızdan emin olmak için telefonunuzun ayarlarında bunları AÇIK durumda tutun." + "value" : "Giao diện mới thêm các tab Xu hướng và Nhật ký. Tắt để quay lại màn hình trạng thái cổ điển; Cài đặt sẽ đóng để chuyển đổi." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "通知可在无需打开 %1$@ 应用的情况下,向你提供重要信息。\n\n请在手机设置中保持通知开启,以确保你能够接收 %1$@ 通知、关键通知和时效性通知。" + "value" : "新界面增加了“趋势”和“日志”标签页。关闭后将返回经典状态屏幕;切换时设置会关闭。" } } } }, - "Observed changes in glucose, subtracting changes modeled from insulin delivery, can be used to estimate carbohydrate absorption." : { - "comment" : "Section explaining carb effects chart" - }, - "Off" : { - "comment" : "Notification Setting Status is Off", + "Time in range" : { + "comment" : "Trends card title: share of glucose readings in each range", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الوقت ضمن النطاق" + } + }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Vypnuto" + "value" : "Čas v rozsahu" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Slukket" + "value" : "Tid i området" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Aus" + "value" : "Zeit im Zielbereich" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Apagado" + "value" : "Tiempo en rango" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Pois päältä" + "value" : "Aika tavoitealueella" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Désactivé" + "value" : "Temps dans la cible" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "כבוי" + "value" : "זמן בטווח" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tartományban töltött idő" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Disattivato" + "value" : "Tempo nell'intervallo" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "範囲内時間" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Av" + "value" : "Tid i målområdet" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Uit" + "value" : "Tijd binnen bereik" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Wyłącz" + "value" : "Czas w zakresie" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tempo no alvo" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Oprit" + "value" : "Timp în interval" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Выключено" + "value" : "Время в диапазоне" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Vypnuté" + "value" : "Čas v rozsahu" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Av" + "value" : "Tid inom målområdet" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Kapalı" + "value" : "Aralıkta geçen süre" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Час у діапазоні" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thời gian trong khoảng" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "关闭" + "value" : "目标范围内时间" } } } }, - "Oh no! Loop crashed while dosing, and insulin adjustments have been paused until this dialog is closed. Dosing history may not be accurate. Please review Insulin Delivery charts, and monitor your blood glucose carefully." : { - "comment" : "Modal body for crash recovery alert", + "Today" : { + "comment" : "Day page title when showing today", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "اليوم" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dnes" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Åh nej! Loop gik ned under dosering, og insulinjusteringer er blevet sat på pause, indtil denne dialogboks er lukket. Doseringshistorikken er muligvis ikke nøjagtig. Gennemgå venligst insulintilførsindstillinger og overvåg dit blodsukker omhyggeligt." + "value" : "I dag" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Oh nein! Loop ist während des Bolus abgestürzt und die Insulinanpassungen wurden angehalten, bis dieser Dialog geschlossen wird. Der Dosierung-Verlauf ist möglicherweise nicht korrekt. Bitte prüfe die Tabellen zur Insulinabgabe und überwache Deinen Blutzucker sorgfältig." + "value" : "Heute" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "¡Oh, no! Loop falló durante la dosificación y los ajustes de insulina se pausaron hasta que se cierre este cuadro de diálogo. El historial de dosificación puede no ser exacto. Revise los gráficos de administración de insulina y controle cuidadosamente su nivel de glucosa en sangre." + "value" : "Hoy" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tänään" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Oh non ! La boucle s'est arrêtée pendant le dosage, et les ajustements d'insuline ont été mis en pause jusqu'à ce que ce dialogue soit fermé. L'historique des dosages peut ne pas être exact. Veuillez revoir les tableaux d'administration d'insuline et surveiller attentivement votre glycémie." + "value" : "Aujourd'hui" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "אוי לא! Loop קרסה בזמן הזרקה והתאמות אינסולין נעצרו עד שתסגור חלון זה. ייתכן שהיסטוריות ההזרקות לא תהיה מדוייקת. עיין בגרף מתן האינסולין ועקוב אחר הגלוקוז שלך מקרוב." + "value" : "היום" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ma" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Oh No! Loop si è chiuso mentre stava eseguendo un bolo e il dosaggio d'insulina è stato messo in pausa, finchè la finestra sarà chiusa. L'elenco dell'infusione d'insulina potrebbe non essere accurato. Per favore rivedi con attenzione la tabella di infusione dell'insulina e sorveglia strettamente la tua glicemia" + "value" : "Oggi" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "今日" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Å nei! Loop krasjet under dosering, og insulinjusteringer er satt på pause til denne dialogen er lukket. Doseringshistorikken er kanskje ikke nøyaktig. Vennligst sjekk diagrammer for insulin levering, og overvåk blodsukkeret nøye." + "value" : "I dag" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Oh nee! Loop is vastgelopen tijdens het toedienen, en insulineaanpassingen zijn gepauzeerd totdat dit dialoogvenster wordt gesloten. De doseringsgeschiedenis is mogelijk niet nauwkeurig. Bekijk de Insulinetoedieningsgrafieken en controleer je bloedglucose nauwkeurig." + "value" : "Vandaag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "O nie! Pętla uległa awarii podczas dozowania, a regulacja insuliny została wstrzymana do czasu zamknięcia tego okna dialogowego. Historia dawkowania może nie być dokładna. Przejrzyj wykresy podawania insuliny i uważnie monitoruj poziom glukozy we krwi." + "value" : "Dziś" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hoje" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Oh nu! Loop s-a blocat în timpul administrării, iar ajustările insulinei au fost întrerupte până la închiderea acestui dialog. Istoricul administrării poate să nu fie exact. Vă rugăm să consultați graficele de administrare a insulinei și să vă monitorizați cu atenție glicemia." + "value" : "Azi" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Внимание! Во время подачи произошел сбой петли, и управление помпой было приостановлено до закрытия этого диалога. История событий может быть неточной. Пожалуйста, просмотрите графики введения инсулина в помпе и внимательно следите за уровнем глюкозы в крови." + "value" : "Сегодня" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dnes" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "I dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Oh hayır! Dozlama sırasında Loop çöktü ve bu iletişim kutusu kapatılana kadar insülin ayarlamaları duraklatıldı. Dozlama geçmişi doğru olmayabilir. Lütfen İnsülin İletim tablolarını gözden geçirin ve kan şekerinizi dikkatle izleyin." + "value" : "Bugün" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сьогодні" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hôm nay" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "糟糕!Loop 在给药过程中发生故障,胰岛素调整功能已暂停,直至关闭此对话框。给药记录可能不准确。请查看胰岛素输注图表,并密切监测您的血糖水平。" + "value" : "今天" } } } }, - "OK" : { - "comment" : "Alert acknowledgment OK button\nCritical Alert permissions disabled alert button\nDefault action for alert when alert acknowledgment fails\nLabel for acknowledging the preset has been active for 24 hours\nNotifications permissions disabled alert button\nText for ok action on notification of upcoming TestFlight expiration\nText for ok action on notification of upcoming profile expiration\nThe title of the notification action to acknowledge a device alert", + "Today so far" : { + "comment" : "Title of the card on the Now screen showing today's insulin and carbs", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "موافق" + "value" : "اليوم حتى الآن" } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Dnes zatím" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "I dag indtil nu" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Heute bisher" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Hoy hasta ahora" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Tänään tähän mennessä" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Aujourd'hui jusqu'ici" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "אישור" + "value" : "היום עד כה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ma eddig" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Oggi finora" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "今日のこれまで" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "I dag så langt" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Vandaag tot nu toe" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Dziś do tej pory" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Hoje até agora" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Azi până acum" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Сегодня на данный момент" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Dnes zatiaľ" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Hittills i dag" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tamam" + "value" : "Bugün şu ana kadar" } }, - "vi" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Сьогодні наразі" } }, - "zh-Hans" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "OK" + "value" : "Hôm nay đến giờ" } - } - } - }, - "Omar asks himself, **do I expect I will need more or less insulin than usual?**" : { - - }, - "Omar Octopus wants to create a preset for some yard work he’ll be doing around the house." : { - - }, - "Omar sets his correction range a little higher, to %@-%@ %@. This tells %@ to step in sooner." : { - "localizations" : { - "en" : { + }, + "zh-Hans" : { "stringUnit" : { - "state" : "new", - "value" : "Omar sets his correction range a little higher, to %1$@-%2$@ %3$@. This tells %4$@ to step in sooner." + "state" : "translated", + "value" : "今日至今" } } } }, - "Omar’s Current Therapy Settings" : { - - }, - "On" : { - "comment" : "Notification Setting Status is On", + "Today · %1$@" : { + "comment" : "Logbook day header for today. (1: weekday and date, e.g. Sun 25 Oct)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "On" + "value" : "اليوم · %1$@" } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Zapnuto" + "value" : "Dnes · %1$@" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Tændt" + "value" : "I dag · %1$@" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "An" + "value" : "Heute · %1$@" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Encendido" + "value" : "Hoy · %1$@" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Päällä" + "value" : "Tänään · %1$@" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Activé" + "value" : "Aujourd'hui · %1$@" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "מופעל" + "value" : "היום · %1$@" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ma · %1$@" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Attivato" + "value" : "Oggi · %1$@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "オン" + "value" : "今日 · %1$@" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "På" + "value" : "I dag · %1$@" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Aan" + "value" : "Vandaag · %1$@" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Włącz" + "value" : "Dziś · %1$@" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Ligado" + "value" : "Hoje · %1$@" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Pornit" + "value" : "Azi · %1$@" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Включено" + "value" : "Сегодня · %1$@" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Zapnuté" + "value" : "Dnes · %1$@" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "På" + "value" : "I dag · %1$@" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Açık" + "value" : "Bugün · %1$@" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Сьогодні · %1$@" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "On" + "value" : "Hôm nay · %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "开" + "value" : "今天 · %1$@" } } } }, - "On until" : { - - }, - "on until %@" : { - "comment" : "The format for the description of a custom preset end date\nThe format for the description of a finite custom preset end date" - }, - "on until carbs added" : { - "comment" : "The format for the description of a premeal preset end date" - }, - "on until turned off" : { - "comment" : "The format for the description of an indefinite custom preset end date" - }, - "Once saved, Omar’s new preset will display in his Presets lists." : { - - }, - "Once you have allowed or denied a data type, %1$@ cannot ask again from within the app. To review or change access, open the Health app, tap your profile, then Apps → %1$@." : { - "comment" : "Health access change instructions (1: app name)" - }, - "Open iOS Settings" : { - "comment" : "A button that opens the iOS settings app.", - "isCommentAutoGenerated" : true - }, - "Other" : { - "comment" : "The group name for plugins that do not declare a manufacturer or category" - }, - "Override Presets" : { - "comment" : "The title text for the override presets", - "extractionState" : "manual", + "Touch and hold a chart to see exact values." : { + "comment" : "Hint under the day page charts explaining how to scrub them", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "تخطي الإعدادات المسبقة" + "value" : "المس مخططًا مع الاستمرار لرؤية القيم الدقيقة." } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Override forudindstillinger" + "value" : "Podržte prst na grafu a uvidíte přesné hodnoty." } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Voreinstellungen" + "value" : "Tryk og hold på et diagram for at se præcise værdier." } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Override Presets" + "value" : "Halte ein Diagramm gedrückt, um genaue Werte zu sehen." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Sobreescrituras preestablecidas" + "value" : "Mantén pulsado un gráfico para ver los valores exactos." } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Tilapäisasetukset" + "value" : "Pidä kaaviota painettuna nähdäksesi tarkat arvot." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Préréglages ajustement" + "value" : "Touchez un graphique de manière prolongée pour voir les valeurs exactes." } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "עקוף הגדרות מוגדרות מראש" + "value" : "גע והחזק תרשים כדי לראות ערכים מדויקים." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Érints meg és tarts lenyomva egy diagramot a pontos értékekért." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Override" + "value" : "Tieni premuto su un grafico per vedere i valori esatti." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "オーバーライドプリセット" + "value" : "グラフを長押しすると正確な値が表示されます。" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Overstyr forhåndsinnstillinger" + "value" : "Trykk og hold på et diagram for å se nøyaktige verdier." } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Override programma's" + "value" : "Houd een grafiek ingedrukt om exacte waarden te zien." } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Override Presets" + "value" : "Dotknij i przytrzymaj wykres, aby zobaczyć dokładne wartości." } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Sobreposições Predefinidas" + "value" : "Toque e segure um gráfico para ver os valores exatos." } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Presetări de înlocuire" + "value" : "Țineți apăsat pe un grafic pentru a vedea valorile exacte." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Редактировать параметры" + "value" : "Нажмите и удерживайте график, чтобы увидеть точные значения." + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podržte prst na grafe a uvidíte presné hodnoty." } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Override förinställningar" + "value" : "Tryck och håll på ett diagram för att se exakta värden." } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Geçersiz Kılma Ön Ayarları" + "value" : "Tam değerleri görmek için bir grafiğe dokunup basılı tutun." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Торкніться й утримуйте графік, щоб побачити точні значення." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Cài đặt chồng liều" + "value" : "Chạm và giữ biểu đồ để xem giá trị chính xác." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "覆盖预设置" + "value" : "按住图表可查看精确数值。" } } } }, - "Overview" : { - - }, - "Paloma Porpoise sees her glucose is running higher than usual. She creates a preset to help manage her glucose while she is sick." : { - - }, - "Paloma wants %@ to know she needs more insulin than usual." : { - - }, - "Paloma’s Adjusted Therapy Settings" : { - - }, - "Paloma’s Current Therapy Settings" : { - - }, - "Pay attention to your insulin needs before and after exercising, playing sports, or doing unusually hard physical labor." : { - - }, - "Performance History" : { - "comment" : "The title of the view that shows the user's preset performance history.", - "isCommentAutoGenerated" : true - }, - "Physical stress, like illness, can cause glucose to rise." : { - - }, - "Planning for physical activity can be tough. If you forget to set a preset ahead of time, consider these strategies:" : { - - }, - "Please go to the App Store now to update the app." : { - "comment" : "Required update modal paragraph 3" - }, - "Possible Missed Meal" : { - "comment" : "The notification title for a meal that was possibly not logged in Loop.", + "Trends" : { + "comment" : "Title of the Trends tab Title of the Trends tab in the redesigned interface", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الاتجاهات" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trendy" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Muligt glemt måltid" + "value" : "Tendenser" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Wahrscheinlich eine Mahlzeit vergessen" + "value" : "Trends" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tendencias" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trendit" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Repas manqué possible" + "value" : "Tendances" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "ייתכן שארוחה לא הוזנה" + "value" : "מגמות" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trendek" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Possibile pasto saltato" + "value" : "Tendenze" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "トレンド" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Mulig savnet måltid" + "value" : "Trender" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Mogelijk gemiste maaltijd" + "value" : "Trends" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Możliwe pominięcie posiłku" + "value" : "Trendy" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tendências" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Posibilă masă neanunțată" + "value" : "Tendințe" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Возможный пропуск приема пищи" + "value" : "Тренды" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trendy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trender" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Muhtemel Kaçırılan Öğün" + "value" : "Eğilimler" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тренди" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xu hướng" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "可能未进餐" + "value" : "趋势" } } } }, - "Power lifting" : { - - }, - "Pre-meal Preset" : { - "comment" : "Status row title for premeal override enabled" - }, - "Pre-Meal Targets" : { - "comment" : "The label of the pre-meal mode toggle button", - "extractionState" : "stale", + "U/h" : { + "comment" : "Abbreviation for insulin units per hour", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "أهداف ما قبل الوجبة" + "value" : "وحدة لكل ساعة" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "U/hod" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Før-måltid Mål" + "value" : "E/t" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ziel vor dem Essen" + "value" : "IE/Std" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Objetivos Pre-Comida" + "value" : "U/h" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ennen ateriaa -tavoite" + "value" : "U/h" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Objectif de Pré-Repas" + "value" : "U/h" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "יעדים לפני הארוחה" + "value" : "U/hr" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "U/óra" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Obiettivo pre-pasto" + "value" : "U/ora" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "食前ターゲット" + "value" : "単位/時" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Målområde før måltid" + "value" : "E/t" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Pre-Meal doelen" + "value" : "E/uur" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Poziom przed posiłkiem" + "value" : "J/h" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Meta Pré-Refeição" + "value" : "U/h" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Ținte înainte de masă" + "value" : "U/oră" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Целевые значения до еды" + "value" : "Ед/ч" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "J/hod" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Målvärden före måltid" + "value" : "IE/h" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Yemek Öncesi Hedefler" + "value" : "Ü/Sa" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "U/год" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Mục tiêu trước bữa ăn" + "value" : "U/giờ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "餐前目标" + "value" : "U/小时" } } } }, - "Predicted glucose at %1$@ is %2$@." : { - "comment" : "Message when offering bolus recommendation even though bg is below range and minBG is in future. (1: glucose time)(2: glucose number)", + "unknown" : { + "comment" : "VoiceOver value when active insulin or carbs at the current time isn't known", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "قراءاة سكر الدم بعد %1$@ هي %2$@." + "value" : "غير معروف" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "neznámé" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet glukose ved %1$@ er %2$@." + "value" : "ukendt" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Vorhergesagte Glukose um %1$@ ist %2$@." + "value" : "unbekannt" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa proyectada a las %1$@ es %2$@." + "value" : "desconocido" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ennustettu glukoosi klo %1$@ on %2$@." + "value" : "tuntematon" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Glycémie prévue à %1$@ est %2$@." + "value" : "inconnu" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הגלוקוז החזוי ב- %1$@ הוא %2$@ ." + "value" : "לא ידוע" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "ismeretlen" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "La glicemia prevista a %1$@ è di %2$@." + "value" : "sconosciuto" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@の予想グルコースは %2$@です。" + "value" : "不明" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet blodsukker kl %1$@ er %2$@." + "value" : "ukjent" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voorspelde glucose om %1$@ is %2$@." + "value" : "onbekend" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przewidywany poziom cukru o %1$@ wyniesie %2$@" + "value" : "nieznane" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia prevista em %1$@ é %2$@." + "value" : "desconhecido" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia prognozată pentru %1$@ este %2$@." + "value" : "necunoscut" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Прогнозируемый уровень глюкозы на %1$@ составляет %2$@." + "value" : "неизвестно" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Predpokladaná glykémia o %1$@ je %2$@ ." + "value" : "neznáme" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Förväntat glukosvärde vid %1$@ är %2$@." + "value" : "okänt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tahmini KŞ %1$@ %2$@." + "value" : "bilinmiyor" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "невідомо" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Dự đoán đường huyết vào lúc %1$@ là %2$@." + "value" : "không rõ" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "预测%1$@时的葡萄糖是%2$@" + "value" : "未知" } } } }, - "Predicted glucose is in range." : { - "comment" : "Notice when predicted glucose for bolus recommendation is in range", + "Unknown error" : { + "comment" : "Reason Loop could not run: an unexpected error", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "خطأ غير معروف" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neznámá chyba" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Den forventede glukose er inden for intervallet." + "value" : "Ukendt fejl" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Der vorhergesagte Blutzucker liegt im Zielbereich." + "value" : "Unbekannter Fehler" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "La glucosa proyectada está en rango" + "value" : "Error desconocido" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tuntematon virhe" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "La glycémie prévue est dans la plage." + "value" : "Erreur inconnue" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הגלוקוז החזוי נמצא בטווח." + "value" : "שגיאה לא ידועה" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ismeretlen hiba" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "La glicemia prevista è nell'intervallo" + "value" : "Errore sconosciuto" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "不明なエラー" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet blodsukker er innenfor målområdet." + "value" : "Ukjent feil" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voorspelde glucose is binnen bereik." + "value" : "Onbekende fout" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przewidywane stężenie glukozy jest w zakresie." + "value" : "Nieznany błąd" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erro desconhecido" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia prognozată este în interval." + "value" : "Eroare necunoscută" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Прогнозируемый уровень глюкозы находится в диапазоне." + "value" : "Неизвестная ошибка" } }, "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Predpokladaná glykémia je v cieľovom rozsahu." + "value" : "Neznáma chyba" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Okänt fel" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tahmini KŞ aralık içinde." + "value" : "Bilinmeyen hata" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Невідома помилка" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lỗi không xác định" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "预测血糖在目标范围内。" + "value" : "未知错误" } } } }, - "Predicted glucose of %1$@ is below your glucose safety limit setting." : { - "comment" : "Notice message when recommending bolus when BG is below the glucose safety limit. (1: glucose value)", + "Urgent low" : { + "comment" : "Pill under the glucose value on the Now screen when glucose is below 54 mg/dL (3.0 mmol/L)", "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "منخفض عاجل" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kriticky nízká" + } + }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Det forventede glukoseindhold på %1$@ er under din indstilling af glukose-sikkerhedsgrænsen." + "value" : "Akut lav" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Der vorhergesagte Blutzucker von %1$@ liegt unter der Sicherheitsgrenze." + "value" : "Dringend niedrig" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa proyectada de %1$@ se encuentra por debajo de tu nivel de suspensión." + "value" : "Baja urgente" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ennustettu glukoosi %1$@ on turvarajan alapuolella." + "value" : "Vaarallisen matala" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "La glycémie estimée à %1$@ est sous le seuil de suspension." + "value" : "Basse urgente" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הגלוקוז החזוי %1$@ נמוך מגבול הבטיחות שהגדרת." + "value" : "נמוך דחוף" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sürgősen alacsony" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "La glicemia prevista da %1$@ è al di sotto del tuo limite glicemico di sicurezza." + "value" : "Bassa urgente" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "緊急低値" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet blodsukker på %1$@ er lavere enn innstillingen for blodsukkersikkerhet." + "value" : "Akutt lav" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voorspelde glucose van %1$@ ligt onder je ingestelde glucoseveiligheidslimiet." + "value" : "Urgent laag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przewidywana glukoza %1$@ jest poniżej ustawionego bezpiecznego limitu glukozy." + "value" : "Krytycznie niska" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Baixa urgente" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia prognozată de %1$@ se situează sub limita de siguranță configurată." + "value" : "Urgent scăzută" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Прогнозируемое значение глюкозы %1$@ ниже установленного вами предела безопасности глюкозы." + "value" : "Опасно низкая" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kriticky nízka" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Förväntat blodsocker på %1$@ är under ditt tröskelvärde." + "value" : "Akut lågt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "%1$@ tahmini KŞ, KŞ güvenlik limiti ayarınızın altında." + "value" : "Acil düşük" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Небезпечно низька" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thấp khẩn cấp" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "预测血糖 %1$@ 低于你设定的血糖安全下限。" + "value" : "紧急低血糖" } } } }, - "Predicted glucose of %1$@ is below your suspend threshold setting." : { - "comment" : "Notice message when recommending bolus when BG is below the suspend threshold. (1: glucose value)", - "extractionState" : "manual", + "Very high" : { + "comment" : "Time in range band: glucose above 250 mg/dL (13.9 mmol/L) Time-in-range band name: glucose above 250 mg/dL (13.9 mmol/L)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "قراءة سكر الدم المتوقعة %1$@ أقل من قيمة تعليق الضخ في الإعدادات." + "value" : "مرتفع جدًا" } }, - "da" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet glukose på %1$@ er under din indstilling for suspenderingstærskel." + "value" : "Velmi vysoká" } }, - "de" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Der vorhergesagte Blutzucker von %1$@ liegt unter dem Grenzwert für die Hypo-Abschaltung." + "value" : "Meget høj" } }, - "en" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Predicted glucose of %1$@ is below your suspend threshold setting." + "value" : "Sehr hoch" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Glucosa proyectada de %1$@ se encuentra por debajo de su nivel de suspensión." + "value" : "Muy alta" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ennustettu glukoosi %1$@ on pysäytysrajan alapuolella." + "value" : "Erittäin korkea" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Prédiction de la glycémie à %1$@ sous le seuil de suspension défini." + "value" : "Très élevée" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הגלוקוז החזוי %1$@ נמוך מסך ההשהייה שהגדרת." + "value" : "גבוה מאוד" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nagyon magas" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "La glicemia prevista %1$@ è inferiore al valore soglia per la sospensione dell'erogazione." + "value" : "Molto alta" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "予想グルコースは %1$@ で一時停止値を下回ります。" + "value" : "非常に高い" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet blodsukker %1$@ er lavere enn innstilling for insulinstopp" + "value" : "Svært høy" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Verwachte glucose van %1$@ is lager dan je ingestelde insulineonderbrekingsdrempel." + "value" : "Zeer hoog" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przewidywany poziom cukru %1$@ jest poniżej progu zawieszenia." + "value" : "Bardzo wysoka" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia prevista de %1$@ está abaixo do limite de suspensão." + "value" : "Muito alta" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Glicemia prognozată de %1$@ se situează sub limita de suspendare configurată" + "value" : "Foarte ridicată" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Предсказываемая гликемия %1$@ ниже ваших настроек порога приостановки помпы" + "value" : "Очень высокая" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veľmi vysoká" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Förväntat glukosvärde %1$@ är under ditt tröskelvärde." + "value" : "Mycket högt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tahmini KŞ %1$@ askıya alma eşiği ayarınızın altında." + "value" : "Çok yüksek" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дуже висока" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Dự đoán đường huyết %1$@ là dưới ngưỡng tạm ngưng trong cài đặt của bạn." + "value" : "Rất cao" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "预测葡萄糖%1$@低于您的暂停阈值设置" + "value" : "非常高" } } } }, - "Predicted: %1$@\nActual: %2$@ (%3$@)" : { - "comment" : "Format string describing retrospective glucose prediction comparison. (1: Predicted glucose)(2: Actual glucose)(3: difference)", + "Very low" : { + "comment" : "Time in range band: glucose below 54 mg/dL (3.0 mmol/L) Time-in-range band name: glucose below 54 mg/dL (3.0 mmol/L)", "localizations" : { "ar" : { "stringUnit" : { "state" : "translated", - "value" : "التوقع: %1$@\nالواقع: %2$@ (%3$@)" + "value" : "منخفض جدًا" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velmi nízká" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet: %1$@\nFaktisk: %2$@ (%3$@)" + "value" : "Meget lav" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Vorhergesagt: %1$@\nAktuell: %2$@ (%3$@)" + "value" : "Sehr niedrig" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Predicción: %1$@\nActual: %2$@ (%3$@)" + "value" : "Muy baja" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Ennustettu: %1$@\nTodellinen: %2$@ (%3$@)" + "value" : "Erittäin matala" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Prédit : %1$@\nRéel : %2$@ (%3$@)" + "value" : "Très basse" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "חזוי: %1$@\nבפועל: %2$@ (%3$@)" + "value" : "נמוך מאוד" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nagyon alacsony" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Previsto: %1$@\nEffettivo: %2$@ (%3$@)" + "value" : "Molto bassa" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Predicted: %1$@\nActual: %2$@ (%3$@)" + "value" : "非常に低い" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet: %1$@\nFaktisk: %2$@ ( %3$@ )" + "value" : "Svært lav" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Voorspeld: %1$@\nActueel: %2$@ (%3$@)" + "value" : "Zeer laag" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Przewidywana: %1$@Rzeczywista: %2$@ (%3$@)" + "value" : "Bardzo niska" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Prevista: %1$@\nAtual: %2$@ (%3$@)" + "value" : "Muito baixa" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Prognozată: %1$@\nActuală: %2$@ (%3$@)" + "value" : "Foarte scăzută" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Прогноз: %1$@\nФакт: %2$@ (%3$@)" + "value" : "Очень низкая" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veľmi nízka" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Förväntat: %1$@\nFaktiskt: %2$@ (%3$@)" + "value" : "Mycket lågt" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Tahmini: %1$@\nGüncel: %2$@ (%3$@)" + "value" : "Çok düşük" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дуже низька" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Được dự đoán: %1$@\nThực tế: %2$@ (%3$@)" + "value" : "Rất thấp" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "预测值: %1$@\n实际值: %2$@ (%3$@)" + "value" : "非常低" } } } }, - "prediction-description-integral-retrospective-correction" : { - "comment" : "Format string describing integral retrospective correction. (1: Integral glucose effect)(2: Total glucose effect)", + "vs plan" : { + "comment" : "Logbook basal adjustments row: the insulin amount is the difference from the scheduled basal", "localizations" : { - "da" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "prediction-description-integral-retrospective-correction" + "value" : "مقارنة بالمجدول" } }, - "de" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Integraler Effekt: %1$@ \n Gesamtglukoseeffekt: %2$@" + "value" : "oproti plánu" } }, - "en" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Integral effect: %1$@\nTotal glucose effect: %2$@" + "value" : "ift. plan" } }, - "fr" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Effet intégral: %1$@\nEffet total sur la glycémie: %2$@" + "value" : "ggü. Plan" } }, - "it" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "previsione-descrizione-integrale-correzione-retrospettiva" + "value" : "vs. lo programado" } }, - "nb" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "prediksjon-beskrivelse-integral-retrospektiv-korreksjon" + "value" : "vs. ohjelmoitu" } }, - "nl" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Integraal effect: %1$@\nTotaal glucose-effect: %2$@" + "value" : "vs prévu" } }, - "pl" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "predykcja-opis-całka-retrospektywna-korekta" + "value" : "לעומת התוכנית" } }, - "ro" : { + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Efect integral: %1$@ \nEfect total al glicemiei: %2$@" + "value" : "a tervhez képest" } }, - "ru" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "описание прогнозирования с помощью интегральной ретроспективной коррекции" + "value" : "vs programmata" } }, - "zh-Hans" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "积分效应: %1$@\n总葡萄糖效应: %2$@" + "value" : "予定比" } - } - } - }, - "prediction-description-retrospective-correction" : { - "comment" : "Format string describing retrospective glucose prediction comparison. (1: Predicted glucose)(2: Actual glucose)(3: difference)", - "extractionState" : "manual", - "localizations" : { - "ar" : { + }, + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "التوقع: %1$@\nالواقع: %2$@ (%3$@)" + "value" : "mot plan" } }, - "da" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet: %1$@\nFaktisk: %2$@ (%3$@)" + "value" : "t.o.v. gepland" } }, - "de" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Vorhergesagt: %1$@\nAktuell: %2$@ (%3$@)" + "value" : "wzgl. planu" } }, - "en" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Predicted: %1$@\nActual: %2$@ (%3$@)" + "value" : "vs. programado" } }, - "es" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Predicción: %1$@\nActual: %2$@ (%3$@)" + "value" : "față de program" } }, - "fi" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Ennustettu: %1$@\nTodellinen: %2$@ (%3$@)" + "value" : "к плану" } }, - "fr" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Prédit : %1$@\nRéel : %2$@ (%3$@)" + "value" : "oproti plánu" } }, - "he" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "חזוי: %1$@\nבפועל: %2$@ (%3$@)" + "value" : "mot schema" } }, - "it" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Previsto: %1$@\nEffettivo: %2$@ (%3$@)" + "value" : "plana göre" } }, - "ja" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Predicted: %1$@\nActual: %2$@ (%3$@)" + "value" : "до плану" } }, - "nb" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Forventet: %1$@\nFaktisk: %2$@ ( %3$@ )" + "value" : "so với lịch" } }, - "nl" : { + "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "Voorspeld: %1$@\nActueel: %2$@ (%3$@)" + "value" : "较预设" } - }, - "pl" : { + } + } + }, + "Yesterday · %1$@" : { + "comment" : "Logbook day header for yesterday. (1: weekday and date, e.g. Sat 24 Oct)", + "localizations" : { + "ar" : { "stringUnit" : { "state" : "translated", - "value" : "Przewidywana: %1$@Rzeczywista: %2$@ (%3$@)" + "value" : "أمس · %1$@" } }, - "pt-BR" : { + "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Prevista: %1$@\nAtual: %2$@ (%3$@)" + "value" : "Včera · %1$@" } }, - "ro" : { + "da" : { "stringUnit" : { "state" : "translated", - "value" : "Prognozată: %1$@\nActuală: %2$@ (%3$@)" + "value" : "I går · %1$@" } }, - "ru" : { + "de" : { "stringUnit" : { "state" : "translated", - "value" : "Прогноз: %1$@\nФакт: %2$@ (%3$@)" + "value" : "Gestern · %1$@" } }, - "sv" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "Förväntat: %1$@\nFaktiskt: %2$@ (%3$@)" + "value" : "Ayer · %1$@" } }, - "tr" : { + "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Tahmini: %1$@\nGüncel: %2$@ (%3$@)" + "value" : "Eilen · %1$@" } }, - "vi" : { + "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Được dự đoán: %1$@\nThực tế: %2$@ (%3$@)" + "value" : "Hier · %1$@" } }, - "zh-Hans" : { + "he" : { "stringUnit" : { "state" : "translated", - "value" : "预测值: %1$@\n实际值: %2$@ (%3$@)" + "value" : "אתמול · %1$@" } - } - } - }, - "Preparing Critical Event Logs" : { - "comment" : "Preparing critical event log text", - "localizations" : { - "da" : { + }, + "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Forbereder kritiske begivenhedslogs" + "value" : "Tegnap · %1$@" } }, - "de" : { + "it" : { "stringUnit" : { "state" : "translated", - "value" : "Vorbereiten der kritischen Ereignis-Protokolle" + "value" : "Ieri · %1$@" } }, - "es" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "Preparando registros de eventos críticos" + "value" : "昨日 · %1$@" } }, - "fi" : { + "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Valmistellaan tärkeiden tapahtumien lokia" + "value" : "I går · %1$@" } }, - "fr" : { + "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Préparation des journaux d’événements critiques" + "value" : "Gisteren · %1$@" } }, - "he" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "מכין יומן שגיאות קריטיות" + "value" : "Wczoraj · %1$@" } }, - "it" : { + "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Preparazione dei registri degli eventi critici in corso" + "value" : "Ontem · %1$@" } }, - "nb" : { + "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Forbereder logg av kritiske hendelser" + "value" : "Ieri · %1$@" } }, - "nl" : { + "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Kritieke gebeurtenislogboek voorbereiden" + "value" : "Вчера · %1$@" } }, - "pl" : { + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "Przygotowywanie dzienników zdarzeń krytycznych" + "value" : "Včera · %1$@" } }, - "ro" : { + "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Pregătire jurnal de evenimente critice" + "value" : "I går · %1$@" } }, - "ru" : { + "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Подготовка логов критических событий" + "value" : "Dün · %1$@" } }, - "sv" : { + "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Förbereder kritiska händelseloggar" + "value" : "Учора · %1$@" } }, - "tr" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Kritik Olay Günlüklerinin Hazırlanması" + "value" : "Hôm qua · %1$@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "正在准备关键事件日志" + "value" : "昨天 · %1$@" } } } }, - "Preset +6 Hours" : { - "comment" : "Title for a section of a screen that shows a comparison of a user's glucose performance during a preset and 6 hours after the preset.", - "isCommentAutoGenerated" : true - }, - "Preset Delivery" : { - - }, - "Preset Disabled" : { - - }, - "Preset Enabled" : { - - }, - "Preset Summary" : { - - }, - "Presets" : { - "comment" : "Presets screen title\nTitle text for button to Preset Settings" - }, "Presets can be used for a variety of situations. Explore the uses below to learn tips for these common scenarios." : { }, @@ -32848,6 +68800,30 @@ "state" : "translated", "value" : "胰岛素泵" } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpa" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpa" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pumpa" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Помпа" + } } } }, @@ -35531,6 +71507,18 @@ "state" : "translated", "value" : "重试" } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Újra" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Спробувати ще раз" + } } } }, @@ -35876,6 +71864,66 @@ "state" : "translated", "value" : "预设" } + }, + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "المجدول" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plánovaný" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ohjelmoitu" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ütemezett" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "スケジュール" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Programada" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plánovaný" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Schemalagd" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "За розкладом" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Theo lịch" + } } } }, @@ -36303,6 +72351,24 @@ "state" : "translated", "value" : "设置" } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavení" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Beállítások" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Налаштування" + } } } }, @@ -40595,6 +76661,24 @@ "state" : "translated", "value" : "U" } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "U" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "U" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "U" + } } } }, @@ -44891,4 +80975,4 @@ } }, "version" : "1.1" -} \ No newline at end of file +} diff --git a/Loop/Managers/LoopAppManager.swift b/Loop/Managers/LoopAppManager.swift index 57d121a979..b233c41fc6 100644 --- a/Loop/Managers/LoopAppManager.swift +++ b/Loop/Managers/LoopAppManager.swift @@ -200,6 +200,7 @@ class LoopAppManager: NSObject { precondition(state == .launchManagers) windowProvider?.window?.tintColor = .loopAccent + windowProvider?.window?.overrideUserInterfaceStyle = LoopAppearancePreference.current.interfaceStyle OrientationLock.deviceOrientationController = self resetLoopManager = ResetLoopManager(delegate: self) @@ -518,6 +519,24 @@ class LoopAppManager: NSObject { analyticsServicesManager.application(didFinishLaunchingWithOptions: launchOptions) + // Loop's automation history only goes back 36 hours, so the Trends screen keeps its own longer record. + // The debounce keeps a quick off-and-on from being recorded as open loop. + ObservablePublishers.tracking(settingsManager, keyPath: \.dosingEnabled) + .debounce(for: .seconds(15), scheduler: RunLoop.main) + .removeDuplicates() + .sink { LoopModeHistory.shared.record(closedLoop: $0) } + .store(in: &cancellables) + + NotificationCenter.default.publisher(for: LoopAppearancePreference.didChange) + .receive(on: RunLoop.main) + .sink { [weak self] _ in self?.windowProvider?.window?.overrideUserInterfaceStyle = LoopAppearancePreference.current.interfaceStyle } + .store(in: &cancellables) + + NotificationCenter.default.publisher(for: LoopInterfacePreference.didChange) + .receive(on: RunLoop.main) + .sink { [weak self] _ in self?.relaunchHomeScreenForInterfaceChange() } + .store(in: &cancellables) + state = state.next await loopDataManager.updateDisplayState() @@ -623,10 +642,8 @@ class LoopAppManager: NSObject { return viewModel }() - private func launchHomeScreen() async { - dispatchPrecondition(condition: .onQueue(.main)) - precondition(state == .launchHomeScreen) - + /// Builds the status screen and makes it (or the redesign's tabs around it) the window's root. + private func installHomeScreen() { let viewModel = StatusTableViewModel( alertPermissionsChecker: alertPermissionsChecker, alertMuter: alertManager.alertMuter, @@ -652,26 +669,58 @@ class LoopAppManager: NSObject { self.statusTableViewController = statusTableView.viewController - var rootNavigationController = rootViewController as? RootNavigationController - if rootNavigationController == nil { - rootNavigationController = RootNavigationController() - rootViewController = rootNavigationController - } + let showsActionTabs = !LoopInterfacePreference.useRedesign + let statusScreen = UIHostingController( + rootView: statusTableView + .showsActionTabs(showsActionTabs) + .environmentObject(deviceDataManager.displayGlucosePreference) + .environment(\.appName, Bundle.main.bundleDisplayName) + .environment(\.isInvestigationalDevice, FeatureFlags.isInvestigationalDevice) + .environment(\.guidanceColors, .default) + .environment(\.loopStatusColorPalette, .loopStatus) + .environment(\.colorPalette, .default) + .environment(\.settingsManager, settingsManager) + .environment(\.temporaryPresetsManager, temporaryPresetsManager) + .edgesIgnoringSafeArea(.top) + ) - rootNavigationController?.setViewControllers([ - UIHostingController( - rootView: statusTableView - .environmentObject(deviceDataManager.displayGlucosePreference) - .environment(\.appName, Bundle.main.bundleDisplayName) - .environment(\.isInvestigationalDevice, FeatureFlags.isInvestigationalDevice) - .environment(\.guidanceColors, .default) - .environment(\.loopStatusColorPalette, .loopStatus) - .environment(\.colorPalette, .default) - .environment(\.settingsManager, settingsManager) - .environment(\.temporaryPresetsManager, temporaryPresetsManager) - .edgesIgnoringSafeArea(.top) + LoopInterfacePreference.syncToExtensions() + if LoopInterfacePreference.useRedesign { + let rootNavigationController = RootNavigationController() + rootNavigationController.setViewControllers([statusScreen], animated: false) + rootViewController = MainTabBarController( + rootNavigationController: rootNavigationController, + statusTableViewController: statusTableView.viewController, + deviceManager: deviceDataManager, + loopDataManager: loopDataManager, + settingsManager: settingsManager ) - ], animated: true) + } else { + var rootNavigationController = rootViewController as? RootNavigationController + if rootNavigationController == nil { + rootNavigationController = RootNavigationController() + rootViewController = rootNavigationController + } + + rootNavigationController?.setViewControllers([statusScreen], animated: true) + } + } + + /// Swaps between the classic and redesigned interface once Loop is running. + private func relaunchHomeScreenForInterfaceChange() { + guard state == .launchComplete else { return } + if let presented = rootViewController?.presentedViewController { + presented.dismiss(animated: true) { [weak self] in self?.installHomeScreen() } + } else { + installHomeScreen() + } + } + + private func launchHomeScreen() async { + dispatchPrecondition(condition: .onQueue(.main)) + precondition(state == .launchHomeScreen) + + installHomeScreen() await deviceDataManager.refreshDeviceData() @@ -755,6 +804,7 @@ class LoopAppManager: NSObject { } analyticsServicesManager.didOpenFromLink() + (rootViewController as? MainTabBarController)?.showNow() switch deeplink { case let .carbEntry(carbEntryLink): diff --git a/Loop/Redesign/AppearanceSettings.swift b/Loop/Redesign/AppearanceSettings.swift new file mode 100644 index 0000000000..437af384d5 --- /dev/null +++ b/Loop/Redesign/AppearanceSettings.swift @@ -0,0 +1,203 @@ +// +// AppearanceSettings.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import UIKit + +/// Light, dark or the system's choice, applied to Loop's whole window. +enum LoopAppearancePreference: String, CaseIterable, Identifiable { + case system + case light + case dark + + private static let key = "com.loopkit.Loop.redesign.appearance" + + static let didChange = Notification.Name("LoopAppearancePreferenceDidChange") + + static var current: LoopAppearancePreference { + get { UserDefaults.standard.string(forKey: key).flatMap(LoopAppearancePreference.init(rawValue:)) ?? .system } + set { + guard newValue != current else { return } + UserDefaults.standard.set(newValue.rawValue, forKey: key) + NotificationCenter.default.post(name: didChange, object: nil) + } + } + + var id: String { rawValue } + + var title: String { + switch self { + case .system: return NSLocalizedString("System", comment: "Appearance option that follows the iPhone's light or dark setting") + case .light: return NSLocalizedString("Day", comment: "Appearance option that always uses light mode") + case .dark: return NSLocalizedString("Night", comment: "Appearance option that always uses dark mode") + } + } + + var interfaceStyle: UIUserInterfaceStyle { + switch self { + case .system: return .unspecified + case .light: return .light + case .dark: return .dark + } + } +} + +/// The home screen icons Loop ships. Classic is the primary icon; the others are alternate icon sets in DerivedAssetsBase. +enum LoopAppIcon: String, CaseIterable, Identifiable { + case classic + case dayAndNight + case day + case night + + var id: String { rawValue } + + /// The asset catalog name passed to `setAlternateIconName`; nil is the primary icon. + var alternateIconName: String? { + switch self { + case .classic: return nil + case .dayAndNight: return "AppIconDayNight" + case .day: return "AppIconDay" + case .night: return "AppIconNight" + } + } + + var title: String { + switch self { + case .classic: return NSLocalizedString("Classic", comment: "Name of Loop's original app icon") + case .dayAndNight: return NSLocalizedString("Day and Night", comment: "Name of the app icon that follows the home screen's light or dark appearance") + case .day: return NSLocalizedString("Day", comment: "Name of the light app icon") + case .night: return NSLocalizedString("Night", comment: "Name of the dark app icon") + } + } + + var detail: String? { + switch self { + case .dayAndNight: return NSLocalizedString("Changes with the home screen's light or dark appearance", comment: "Description of the app icon that follows the home screen appearance") + default: return nil + } + } + + static var current: LoopAppIcon { + let name = UIApplication.shared.alternateIconName + return allCases.first { $0.alternateIconName == name } ?? .classic + } + + /// The preview shown in Settings. iOS doesn't expose alternate icons as images, so they have their own + /// preview image sets; Classic is read from the primary icon files, which a workspace may override. + var preview: UIImage? { + switch self { + case .classic: break + case .dayAndNight: return UIImage(named: "AppIconPreviewDayNight") + case .day: return UIImage(named: "AppIconPreviewDay") + case .night: return UIImage(named: "AppIconPreviewNight") + } + let icons = Bundle.main.object(forInfoDictionaryKey: "CFBundleIcons") as? [String: Any] + let entry = icons?["CFBundlePrimaryIcon"] as? [String: Any] + if let files = entry?["CFBundleIconFiles"] as? [String] { + for file in files.reversed() { + if let image = UIImage(named: file) { return image } + } + } + return (entry?["CFBundleIconName"] as? String).flatMap { UIImage(named: $0) } + } +} + +/// Settings → Appearance: day or night for the app, and which icon the home screen shows. +struct AppearanceSettingsView: View { + @State private var appearance = LoopAppearancePreference.current + @State private var icon = LoopAppIcon.current + @State private var iconError: String? + + var body: some View { + List { + Section(footer: Text(NSLocalizedString("System follows your iPhone's light or dark setting.", comment: "Footer for the appearance choice"))) { + Picker(NSLocalizedString("Appearance", comment: "Title of the light or dark appearance choice"), selection: $appearance) { + ForEach(LoopAppearancePreference.allCases) { option in + Text(option.title).tag(option) + } + } + .pickerStyle(.segmented) + .onChange(of: appearance) { LoopAppearancePreference.current = $0 } + } + + Section(header: Text(NSLocalizedString("App Icon", comment: "Header for the app icon choice")), footer: iconFooter) { + ForEach(LoopAppIcon.allCases) { option in + Button { + choose(option) + } label: { + AppIconRow(icon: option, isSelected: option == icon) + } + .buttonStyle(.plain) + } + } + } + .listStyle(.insetGrouped) + .navigationTitle(NSLocalizedString("Appearance", comment: "Title of the appearance settings screen")) + } + + @ViewBuilder + private var iconFooter: some View { + if let iconError { + Text(iconError).foregroundStyle(LoopDesign.Palette.criticalInk) + } + } + + private func choose(_ option: LoopAppIcon) { + guard option != icon, UIApplication.shared.supportsAlternateIcons else { return } + UIApplication.shared.setAlternateIconName(option.alternateIconName) { error in + DispatchQueue.main.async { + // iOS can report an error from the "icon changed" alert even though the icon did change, + // so the icon iOS now reports decides. + if let error, UIApplication.shared.alternateIconName != option.alternateIconName { + iconError = String(format: NSLocalizedString("The icon couldn't be changed: %@", comment: "Error shown when iOS refuses an app icon change"), error.localizedDescription) + } else { + iconError = nil + icon = option + } + } + } + } +} + +private struct AppIconRow: View { + let icon: LoopAppIcon + let isSelected: Bool + + var body: some View { + HStack(spacing: LoopDesign.Space.s3) { + Group { + if let image = icon.preview { + Image(uiImage: image).resizable() + } else { + LoopDesign.Palette.surfaceSunken + } + } + .frame(width: 52, height: 52) + .clipShape(RoundedRectangle(cornerRadius: 12, style: .continuous)) + .overlay(RoundedRectangle(cornerRadius: 12, style: .continuous).strokeBorder(LoopDesign.Palette.separator, lineWidth: 0.5)) + .accessibilityHidden(true) + VStack(alignment: .leading, spacing: 2) { + Text(icon.title) + .foregroundStyle(LoopDesign.Palette.ink) + if let detail = icon.detail { + Text(detail) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(LoopDesign.Palette.inkMuted) + } + } + Spacer(minLength: 0) + if isSelected { + Image(systemName: "checkmark") + .font(.body.weight(.semibold)) + .foregroundStyle(LoopDesign.Palette.accent) + } + } + .contentShape(Rectangle()) + .accessibilityElement(children: .combine) + .accessibilityAddTraits(isSelected ? [.isButton, .isSelected] : .isButton) + } +} diff --git a/Loop/Redesign/CarbEntryScreen.swift b/Loop/Redesign/CarbEntryScreen.swift new file mode 100644 index 0000000000..63600b0db7 --- /dev/null +++ b/Loop/Redesign/CarbEntryScreen.swift @@ -0,0 +1,776 @@ +// +// CarbEntryScreen.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit +import LoopKitUI +import Charts + +private typealias P = LoopDesign.Palette + +/// Adding or editing carbs in the redesign. It drives the same CarbEntryViewModel as CarbEntryView, so validation, +/// favourite foods and the hand-off to the bolus screen are unchanged; only the layout is new. +/// +/// The top of the screen is a preview of the meal as Loop will model it: the amount, over Loop's absorption curve +/// drawn on a real time axis. The amount sets the curve's height, the speed its length, and when it was eaten where +/// it sits against now, so every choice below shows its effect there. +struct CarbEntryScreen: View { + @EnvironmentObject private var displayGlucosePreference: DisplayGlucosePreference + @Environment(\.dismissAction) private var dismiss + @Environment(\.guidanceColors) private var guidanceColors + @Environment(\.dynamicTypeSize) private var typeSize + @Environment(\.accessibilityReduceMotion) private var reduceMotion + + @ObservedObject var viewModel: CarbEntryViewModel + + @State private var amountText: String + @State private var eatenChoice: Int? + @State private var showHowAbsorptionTimeWorks = false + @State private var showAddFavoriteFood = false + /// Other was tapped, so it stays chosen even while its food and time still match a preset. + @State private var otherChosen = false + @FocusState private var amountFocused: Bool + @FocusState private var foodTypeFocused: Bool + @Namespace private var thumbs + + private let isNewEntry: Bool + + /// Minutes before now offered as one-tap times. + private static let eatenChoices = [0, 15, 30, 60] + + init(viewModel: CarbEntryViewModel) { + self.viewModel = viewModel + isNewEntry = viewModel.originalCarbEntry == nil + _amountText = State(initialValue: viewModel.carbsQuantity.flatMap { $0 > 0 ? Self.amountFormatter.string(from: NSNumber(value: $0)) : nil } ?? "") + _eatenChoice = State(initialValue: viewModel.originalCarbEntry == nil && abs(viewModel.time.timeIntervalSinceNow) < 60 ? 0 : nil) + } + + var body: some View { + if isNewEntry { + NavigationStack { + content + .navigationTitle(NSLocalizedString("Add carbs", comment: "Button on the Now screen that opens carb entry")) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + Button(NSLocalizedString("Cancel", comment: "Button label for cancel"), action: dismiss) + } + } + } + } else { + content + } + } + + private var content: some View { + ScrollView { + VStack(alignment: .leading, spacing: 22) { + if let override = viewModel.currentOverride { + ActivePresetBanner(override: override) + } + ForEach(Array(viewModel.warnings).sorted { $0.priority < $1.priority }) { warning in + warningView(warning) + } + mealPreview + if isNewEntry, FeatureFlags.allowExperimentalFeatures { + favourites + } + absorption + eaten + } + .padding(.horizontal, LoopDesign.Space.s4) + .padding(.top, LoopDesign.Space.s2) + .padding(.bottom, LoopDesign.Space.s6) + } + // Any scroll puts the keyboard away: at large text sizes it otherwise covers the rest of the form for good. + .scrollDismissesKeyboard(.immediately) + .toolbar { + if amountFocused || foodTypeFocused { + ToolbarItem(placement: .navigationBarTrailing) { + Button("Done") { + amountFocused = false + foodTypeFocused = false + } + } + } + } + .background(P.surface) + .safeAreaInset(edge: .bottom) { continueBar } + .onAppear { + // As FoodTypeRow does: a new entry starts as the medium food, so the entry carries its emoji. + if isNewEntry && !viewModel.usesCustomFoodType && viewModel.selectedDefaultAbsorptionTimeEmoji.isEmpty { + viewModel.selectedDefaultAbsorptionTimeEmoji = Speed.medium.emoji + } + } + .task { + // Focus set while the sheet is still presenting is dropped, so wait for it to settle. + guard viewModel.shouldBeginEditingQuantity else { return } + try? await Task.sleep(for: .milliseconds(450)) + amountFocused = true + } + .onChange(of: viewModel.carbsQuantity) { _, quantity in + // A favourite fills the amount in; keep the field in step unless the person is typing it. + guard !amountFocused else { return } + amountText = quantity.flatMap { $0 > 0 ? Self.amountFormatter.string(from: NSNumber(value: $0)) : nil } ?? "" + } + .navigationDestination(isPresented: Binding(get: { viewModel.bolusViewModel != nil }, set: { if !$0 { viewModel.bolusViewModel = nil } })) { + if let bolusViewModel = viewModel.bolusViewModel { + BolusEntryView(viewModel: bolusViewModel) + .environmentObject(displayGlucosePreference) + .environment(\.dismissAction, dismiss) + .environment(\.guidanceColors, guidanceColors) + } + } + .alert(item: $viewModel.alert, content: alert(for:)) + .sheet(isPresented: $showHowAbsorptionTimeWorks) { + HowAbsorptionTimeWorksView() + } + .sheet(isPresented: $showAddFavoriteFood) { + FavoriteFoodAddEditView(carbsQuantity: viewModel.carbsQuantity, + foodType: viewModel.usesCustomFoodType ? viewModel.foodType : viewModel.selectedDefaultAbsorptionTimeEmoji, + absorptionTime: viewModel.absorptionTime) { food in + showAddFavoriteFood = false + viewModel.onFavoriteFoodSave(food) + } + } + } + + private func animated(_ change: () -> Void) { + if reduceMotion { + change() + } else { + withAnimation(.snappy(duration: 0.3), change) + } + } + + // MARK: Meal preview + + private static let amountFormatter: NumberFormatter = { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + formatter.maximumFractionDigits = 1 + formatter.usesGroupingSeparator = false + return formatter + }() + + private var mealPreview: some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + HStack(alignment: .firstTextBaseline, spacing: LoopDesign.Space.s1) { + TextField(text: $amountText, prompt: Text(verbatim: "0").foregroundStyle(P.inkMuted.opacity(0.45))) { + Text(NSLocalizedString("Amount Consumed", comment: "Label for carb quantity entry row on carb entry screen")) + } + .font(.system(size: 72, weight: .bold, design: .rounded).monospacedDigit()) + .foregroundStyle(P.carbsInk) + .tint(P.carbsInk) + .keyboardType(.decimalPad) + .accessibilityLabel(NSLocalizedString("Amount Consumed", comment: "Label for carb quantity entry row on carb entry screen")) + .accessibilityIdentifier("textField_CarbsAmount") + .fixedSize() + .focused($amountFocused) + .onChange(of: amountText) { _, text in + viewModel.carbsQuantity = Self.amountFormatter.number(from: text)?.doubleValue + } + Text(NSLocalizedString("g", comment: "Abbreviation for grams")) + .font(.system(size: 30, weight: .semibold, design: .rounded)) + .foregroundStyle(P.inkMuted) + .accessibilityHidden(true) + Spacer(minLength: 0) + } + .contentShape(Rectangle()) + .onTapGesture { amountFocused = true } + + TimelineView(.everyMinute) { context in + MealAbsorptionChart(grams: viewModel.carbsQuantity ?? 0, + absorptionTime: viewModel.absorptionTime, + eaten: viewModel.time, + now: context.date, + axisLength: max(viewModel.defaultAbsorptionTimes.slow, viewModel.absorptionTime)) + } + } + .padding(.horizontal, LoopDesign.Space.s4) + .padding(.top, LoopDesign.Space.s1) + .padding(.bottom, LoopDesign.Space.s4) + .background(P.surfaceRaised, in: RoundedRectangle(cornerRadius: 22, style: .continuous)) + } + + // MARK: Favourites + + @ViewBuilder + private var favourites: some View { + if !viewModel.favoriteFoods.isEmpty || !viewModel.saveFavoriteFoodButtonDisabled { + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + sectionTitle(NSLocalizedString("Favorite Foods", comment: "The section title for Carb entry screen where Favorite Foods can be selected")) + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: LoopDesign.Space.s2) { + ForEach(Array(viewModel.favoriteFoods.enumerated()), id: \.element.id) { index, food in + let selected = viewModel.selectedFavoriteFoodIndex == index + Button { + amountFocused = false + // A favourite brings its own food and time, so the speed shown follows it rather than an earlier Other. + otherChosen = false + animated { viewModel.selectedFavoriteFoodIndex = selected ? -1 : index } + } label: { + HStack(spacing: 6) { + Text(food.foodType) + Text(food.name).foregroundStyle(P.ink) + Text(LoopFormat.grams(food.carbsQuantity.doubleValue(for: .gram))) + .monospacedDigit() + .foregroundStyle(selected ? P.carbsInk : P.inkMuted) + } + .font(LoopDesign.Typeface.subhead.weight(.medium)) + .padding(.horizontal, 14) + .frame(minHeight: 40) + .background(selected ? P.carbs.opacity(0.18) : P.surfaceRaised, in: Capsule()) + .overlay(Capsule().strokeBorder(selected ? P.carbs : .clear, lineWidth: 1.5)) + } + .buttonStyle(.plain) + .accessibilityAddTraits(selected ? .isSelected : []) + } + if viewModel.selectedFavoriteFood == nil { + Button { + showAddFavoriteFood = true + } label: { + Label(NSLocalizedString("Save as favorite food", comment: "Button on the carb entry screen to save the entry as a favourite food"), systemImage: "star") + .font(LoopDesign.Typeface.subhead.weight(.medium)) + .padding(.horizontal, 14) + .frame(minHeight: 40) + .overlay(Capsule().strokeBorder(P.separator.opacity(0.7), style: StrokeStyle(lineWidth: 1, dash: [3, 3]))) + } + .buttonStyle(.plain) + .foregroundStyle(P.accentInk) + .disabled(viewModel.saveFavoriteFoodButtonDisabled) + .opacity(viewModel.saveFavoriteFoodButtonDisabled ? 0.4 : 1) + } + } + .padding(.vertical, 1) + } + .scrollClipDisabled() + } + } + } + + // MARK: Eaten + + private func eatenTitle(_ minutes: Int) -> String { + minutes == 0 + ? NSLocalizedString("Now", comment: "Carb entry time choice: eaten now") + : String(format: NSLocalizedString("%1$@ ago", comment: "Carb entry time choice: eaten this long before now. (1: duration, e.g. 15m or 1h)"), LoopFormat.duration(Double(minutes) * 60)) + } + + private var eaten: some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + let header = typeSize.isAccessibilitySize + ? AnyLayout(VStackLayout(alignment: .leading, spacing: LoopDesign.Space.s2)) + : AnyLayout(HStackLayout(alignment: .center)) + header { + sectionTitle(NSLocalizedString("Eaten", comment: "Carb entry section title: when the food was eaten")) + if !typeSize.isAccessibilitySize { Spacer() } + DatePicker(selection: Binding(get: { viewModel.time }, set: { viewModel.time = $0; eatenChoice = nil }), + in: viewModel.minimumDate...viewModel.maximumDate, displayedComponents: [.date, .hourAndMinute]) { + Text(NSLocalizedString("Time", comment: "Carb entry row label: the exact time the food was eaten")) + } + .labelsHidden() + .tint(P.carbsInk) + } + ChoiceTrack(choices: Self.eatenChoices, selection: eatenChoice, thumb: "eaten", namespace: thumbs) { minutes in + amountFocused = false + let date = Date().addingTimeInterval(-Double(minutes) * 60) + animated { + eatenChoice = minutes + viewModel.time = min(max(date, viewModel.minimumDate), viewModel.maximumDate) + } + } label: { minutes, selected in + Text(eatenTitle(minutes)) + .font(LoopDesign.Typeface.subhead.weight(selected ? .semibold : .medium).monospacedDigit()) + .foregroundStyle(selected ? P.carbsInk : P.ink) + .lineLimit(1) + .minimumScaleFactor(0.8) + .padding(.vertical, LoopDesign.Space.s2) + } + } + } + + // MARK: Absorption + + enum Speed: CaseIterable { + case fast, medium, slow, other + + /// The emoji FoodTypeRow uses for each default absorption time; the entry stores it as its food type. + var emoji: String { + switch self { + case .fast: return "🍭" + case .medium: return "🌮" + case .slow: return "🍕" + case .other: return "🍽️" + } + } + + var title: String { + switch self { + case .fast: return NSLocalizedString("Fast", comment: "Carb entry absorption choice: food that absorbs quickly, such as sweets") + case .medium: return NSLocalizedString("Medium", comment: "Carb entry absorption choice: a typical mixed meal") + case .slow: return NSLocalizedString("Slow", comment: "Carb entry absorption choice: food that absorbs slowly, such as pizza") + case .other: return NSLocalizedString("Other", comment: "Carb entry absorption choice: set your own food and absorption time") + } + } + } + + private func hours(_ speed: Speed) -> TimeInterval { + switch speed { + case .fast: return viewModel.defaultAbsorptionTimes.fast + case .medium: return viewModel.defaultAbsorptionTimes.medium + case .slow: return viewModel.defaultAbsorptionTimes.slow + case .other: return viewModel.absorptionTime + } + } + + private var selectedSpeed: Speed { + let presets = Speed.allCases.filter { $0 != .other } + if viewModel.usesCustomFoodType { + if otherChosen { return .other } + // A saved entry comes back as a custom food; one that is exactly a preset's emoji and time shows as that preset. + return presets.first { $0.emoji == viewModel.foodType && hours($0) == viewModel.absorptionTime } ?? .other + } + return presets.first { $0.emoji == viewModel.selectedDefaultAbsorptionTimeEmoji } ?? .medium + } + + private var absorption: some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + HStack { + sectionTitle(NSLocalizedString("How fast it absorbs", comment: "Carb entry section title: choose how quickly the food's carbs absorb")) + Spacer() + Button { + showHowAbsorptionTimeWorks = true + } label: { + Image(systemName: "info.circle") + .font(LoopDesign.Typeface.subhead.weight(.semibold)) + .frame(minWidth: 44, minHeight: 28, alignment: .trailing) + } + .foregroundStyle(P.accentInk) + .accessibilityLabel(NSLocalizedString("Absorption Time", comment: "Accessibility label for the button that explains carb absorption time")) + } + ChoiceTrack(choices: Speed.allCases, selection: selectedSpeed, thumb: "speed", namespace: thumbs) { speed in + animated { choose(speed) } + } label: { speed, selected in + VStack(spacing: 2) { + Text(speed.title) + .font(LoopDesign.Typeface.subhead.weight(selected ? .semibold : .medium)) + .foregroundStyle(selected ? P.carbsInk : P.ink) + HStack(spacing: 3) { + // The food the entry is saved with; Other shows the one typed in. + Text(speed == .other && selected && !viewModel.foodType.isEmpty ? viewModel.foodType : speed.emoji) + .dynamicTypeSize(...DynamicTypeSize.xxxLarge) + Text(durationLabel(speed, selected: selected)) + .foregroundStyle(selected ? P.carbsInk : P.inkMuted) + } + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + } + .lineLimit(1) + .minimumScaleFactor(0.75) + .padding(.vertical, 10) + .accessibilityElement(children: .ignore) + .accessibilityLabel("\(speed.title), \(durationLabel(speed, selected: selected))") + } + if selectedSpeed == .other { + otherFood + .transition(.opacity.combined(with: .move(edge: .top))) + } + } + } + + private func durationLabel(_ speed: Speed, selected: Bool) -> String { + speed == .other && !selected + ? NSLocalizedString("Custom", comment: "Carb entry absorption choice Other, before it is chosen: you set the food and absorption time yourself") + : LoopFormat.duration(hours(speed)) + } + + private var otherFood: some View { + VStack(spacing: 0) { + HStack { + Text(NSLocalizedString("Food Type", comment: "Label for the food type row on the carb entry screen")) + .font(LoopDesign.Typeface.body) + Spacer() + TextField(Speed.other.emoji, text: $viewModel.foodType) + .multilineTextAlignment(.trailing) + .font(.title3) + .focused($foodTypeFocused) + .frame(maxWidth: 120) + } + .padding(.vertical, 10) + Divider() + Stepper(value: Binding(get: { viewModel.absorptionTime }, set: { newValue in animated { viewModel.absorptionTime = newValue } }), + in: viewModel.absorptionRimesRange, step: 30 * 60) { + HStack { + Text(NSLocalizedString("Absorption Time", comment: "Accessibility label for the button that explains carb absorption time")) + .font(LoopDesign.Typeface.body) + Spacer() + Text(LoopFormat.duration(viewModel.absorptionTime)) + .font(LoopDesign.Typeface.body.monospacedDigit()) + .foregroundStyle(P.carbsInk) + } + } + .padding(.vertical, 10) + } + .padding(.horizontal, LoopDesign.Space.s4) + .background(P.surfaceRaised, in: RoundedRectangle(cornerRadius: 15, style: .continuous)) + } + + private func choose(_ speed: Speed) { + amountFocused = false + // Re-choosing the shown speed changes nothing, so an unedited entry stays unedited. + guard speed != selectedSpeed else { return } + // A favourite sets its own food and absorption; choosing a speed instead lets it go but keeps the amount. + if viewModel.selectedFavoriteFood != nil { + let quantity = viewModel.carbsQuantity + viewModel.selectedFavoriteFoodIndex = -1 + viewModel.carbsQuantity = quantity + } + otherChosen = speed == .other + if speed == .other { + viewModel.usesCustomFoodType = true + foodTypeFocused = true + } else { + viewModel.usesCustomFoodType = false + viewModel.foodType = "" + viewModel.selectedDefaultAbsorptionTimeEmoji = speed.emoji + viewModel.absorptionTime = hours(speed) + } + } + + // MARK: Continue + + private var continueBar: some View { + Button(action: viewModel.continueToBolus) { + Text(NSLocalizedString("Continue", comment: "Button label for continue")) + .font(LoopDesign.Typeface.headline) + .foregroundStyle(viewModel.continueButtonDisabled ? P.inkMuted : P.onFill) + .frame(maxWidth: .infinity, minHeight: 54) + .background(viewModel.continueButtonDisabled ? P.surfaceRaised : P.carbs, + in: RoundedRectangle(cornerRadius: 18, style: .continuous)) + } + .buttonStyle(.plain) + .disabled(viewModel.continueButtonDisabled) + .accessibilityIdentifier("button_Continue") + .padding(.horizontal, LoopDesign.Space.s4) + .padding(.top, LoopDesign.Space.s2) + .padding(.bottom, LoopDesign.Space.s1) + .background(P.surface) + } + + // MARK: Pieces + + private func sectionTitle(_ title: String) -> some View { + Text(title) + .font(LoopDesign.Typeface.subhead.weight(.semibold)) + .foregroundStyle(P.inkMuted) + .accessibilityAddTraits(.isHeader) + } + + private func warningView(_ warning: CarbEntryViewModel.Warning) -> some View { + HStack(alignment: .top, spacing: LoopDesign.Space.s3) { + Image(systemName: "exclamationmark.triangle.fill") + .foregroundStyle(P.criticalInk) + .accessibilityHidden(true) + Text(warningText(warning)) + .font(LoopDesign.Typeface.subhead) + .foregroundStyle(P.ink) + .fixedSize(horizontal: false, vertical: true) + } + .padding(LoopDesign.Space.s3) + .frame(maxWidth: .infinity, alignment: .leading) + .background(P.statusCritical.opacity(0.16), in: RoundedRectangle(cornerRadius: LoopDesign.Radius.lg, style: .continuous)) + .overlay(RoundedRectangle(cornerRadius: LoopDesign.Radius.lg, style: .continuous).strokeBorder(P.statusCritical.opacity(0.45), lineWidth: 1)) + } + + private func warningText(_ warning: CarbEntryViewModel.Warning) -> String { + switch warning { + case .entryIsMissedMeal: + return NSLocalizedString("Loop has detected an missed meal and estimated its size. Edit the carb amount to match the amount of any carbs you may have eaten.", comment: "Warning displayed when user is adding a meal from an missed meal notification") + case .glucoseRisingRapidly: + return NSLocalizedString("Your glucose is rapidly rising. Check that any carbs you've eaten were logged. If you logged carbs, check that the time you entered lines up with when you started eating.", comment: "Warning to ensure the carb entry is accurate") + } + } + + private func alert(for alert: CarbEntryViewModel.Alert) -> SwiftUI.Alert { + switch alert { + case .maxQuantityExceded: + let message = String( + format: NSLocalizedString("The maximum allowed amount is %@ grams.", comment: "Alert body displayed for quantity greater than max (1: maximum quantity in grams)"), + NumberFormatter.localizedString(from: NSNumber(value: viewModel.maxCarbEntryQuantity.doubleValue(for: viewModel.preferredCarbUnit)), number: .none) + ) + let okMessage = NSLocalizedString("com.loudnate.LoopKit.errorAlertActionTitle", value: "OK", comment: "The title of the action used to dismiss an error alert") + return SwiftUI.Alert( + title: Text("Large Meal Entered", comment: "Title of the warning shown when a large meal was entered"), + message: Text(message), + dismissButton: .cancel(Text(okMessage), action: viewModel.clearAlert) + ) + case .warningQuantityValidation: + let message = String( + format: NSLocalizedString("Did you intend to enter %1$@ grams as the amount of carbohydrates for this meal?", comment: "Alert body when entered carbohydrates is greater than threshold (1: entered quantity in grams)"), + NumberFormatter.localizedString(from: NSNumber(value: viewModel.carbsQuantity ?? 0), number: .none) + ) + return SwiftUI.Alert( + title: Text("Large Meal Entered", comment: "Title of the warning shown when a large meal was entered"), + message: Text(message), + primaryButton: .default(Text("No, edit amount", comment: "The title of the action used when rejecting the the amount of carbohydrates entered."), action: viewModel.clearAlert), + secondaryButton: .cancel(Text("Yes", comment: "The title of the action used when confirming entered amount of carbohydrates."), action: viewModel.clearAlertAndContinueToBolus) + ) + } + } +} + +/// A row of choices sharing one track, with a thumb that slides to the chosen one. Two by two at accessibility text sizes. +private struct ChoiceTrack: View { + let choices: [Choice] + let selection: Choice? + let thumb: String + let namespace: Namespace.ID + let action: (Choice) -> Void + @ViewBuilder let label: (Choice, Bool) -> Label + + @Environment(\.dynamicTypeSize) private var typeSize + + var body: some View { + let columns = Array(repeating: GridItem(.flexible(), spacing: 4), count: typeSize.isAccessibilitySize ? 2 : choices.count) + LazyVGrid(columns: columns, spacing: 4) { + ForEach(choices, id: \.self) { choice in + let selected = choice == selection + Button { + action(choice) + } label: { + label(choice, selected) + .padding(.horizontal, 4) + .frame(maxWidth: .infinity, minHeight: 44) + .background { + if selected { + RoundedRectangle(cornerRadius: 11, style: .continuous) + .fill(P.carbs.opacity(0.18)) + .overlay(RoundedRectangle(cornerRadius: 11, style: .continuous).strokeBorder(P.carbs, lineWidth: 1.5)) + .matchedGeometryEffect(id: thumb, in: namespace) + } + } + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityAddTraits(selected ? .isSelected : []) + } + } + .padding(4) + .background(P.surfaceRaised, in: RoundedRectangle(cornerRadius: 15, style: .continuous)) + } +} + +/// The meal's carbs absorbing over time, drawn the way the day page draws carbs on board: a soft fill under a line, +/// solid up to now and dashed after, over hour gridlines. Touch and hold to read how much is left at any time. +private struct MealAbsorptionChart: View { + let grams: Double + let absorptionTime: TimeInterval + let eaten: Date + let now: Date + /// The longest absorption on offer, so a faster food draws a visibly shorter curve. + let axisLength: TimeInterval + + @State private var selection: Date? + @Environment(\.accessibilityReduceMotion) private var reduceMotion + + private static let height: CGFloat = 120 + private static let nowLabelHeight: CGFloat = 20 + + private var absorbed: Date { eaten.addingTimeInterval(absorptionTime) } + + private var window: DateInterval { + let start = min(eaten, now) + return DateInterval(start: start, end: max(eaten.addingTimeInterval(axisLength), now.addingTimeInterval(15 * 60))) + } + + /// Loop's absorption rate as a share of its peak (PiecewiseLinearAbsorption in LoopAlgorithm): rising to the + /// peak at 15% of the absorption time, steady until half way, then falling to nothing. + private static func shape(_ t: Double) -> Double { + switch t { + case ..<0: return 0 + case ..<0.15: return t / 0.15 + case ..<0.5: return 1 + case ..<1: return (1 - t) / 0.5 + default: return 0 + } + } + + /// The share of the carbs absorbed by `t`: the area under `shape` so far, over its whole area of 0.675. + private static func absorbedShare(_ t: Double) -> Double { + let t = min(max(t, 0), 1) + let area: Double + if t < 0.15 { + area = t * t / 0.3 + } else if t < 0.5 { + area = 0.075 + (t - 0.15) + } else { + area = 0.425 + ((t - 0.5) - (t * t - 0.25) / 2) / 0.5 + } + return min(1, area / 0.675) + } + + /// The plotted height of the peak. Its area stands for the grams, so the peak is the rate, grams over + /// 0.675 × the absorption time; a square root keeps a small snack visible beside a large fast one. + private var peak: Double { + guard grams > 0, absorptionTime > 0 else { return 0.42 } + let gramsPerHour = grams / (0.675 * absorptionTime / 3600) + return min(1, max(0.14, (gramsPerHour / 150).squareRoot())) + } + + private struct Sample: Identifiable { + let date: Date + let value: Double + var id: Date { date } + } + + /// The curve's corners, plus the point where it crosses now, so the solid and dashed parts meet exactly. + private var samples: [Sample] { + var shares = [0, 0.15, 0.5, 1.0] + let nowShare = now.timeIntervalSince(eaten) / max(absorptionTime, 1) + if nowShare > 0 && nowShare < 1 { shares.append(nowShare) } + return shares.sorted().map { Sample(date: eaten.addingTimeInterval($0 * absorptionTime), value: Self.shape($0) * peak) } + } + + private var hourMarks: [Date] { + stride(from: 3600.0, to: window.duration, by: 3600).map { eaten.addingTimeInterval($0) }.filter { window.contains($0) } + } + + var body: some View { + let samples = samples + let past = samples.filter { $0.date <= now } + let future = samples.filter { $0.date >= now } + VStack(spacing: 6) { + Chart { + ForEach(samples) { sample in + AreaMark(x: .value("Time", sample.date), yStart: .value("Base", 0), yEnd: .value("Rate", sample.value), series: .value("Series", "fill")) + .foregroundStyle(P.carbs.opacity(grams > 0 ? 0.16 : 0)) + } + // Already absorbed: a firmer fill under the solid part. + ForEach(past) { sample in + AreaMark(x: .value("Time", sample.date), yStart: .value("Base", 0), yEnd: .value("Rate", sample.value), series: .value("Series", "past-fill")) + .foregroundStyle(P.carbs.opacity(grams > 0 ? 0.22 : 0)) + } + ForEach(past) { sample in + LineMark(x: .value("Time", sample.date), y: .value("Rate", sample.value), series: .value("Series", "past")) + .foregroundStyle(grams > 0 ? P.carbs : P.inkMuted.opacity(0.5)) + .lineStyle(StrokeStyle(lineWidth: 2, lineCap: .round, lineJoin: .round)) + } + ForEach(future) { sample in + LineMark(x: .value("Time", sample.date), y: .value("Rate", sample.value), series: .value("Series", "future")) + .foregroundStyle(grams > 0 ? P.carbs : P.inkMuted.opacity(0.5)) + .lineStyle(StrokeStyle(lineWidth: 2, lineCap: .round, lineJoin: .round, dash: [4, 3])) + } + RuleMark(y: .value("Zero", 0)) + .foregroundStyle(P.separator) + .lineStyle(StrokeStyle(lineWidth: 1)) + RuleMark(x: .value("Now", now)) + .foregroundStyle(P.inkMuted) + .lineStyle(StrokeStyle(lineWidth: 1, dash: [1, 3])) + if let selection { + RuleMark(x: .value("Selected", selection)).foregroundStyle(P.ink.opacity(0.6)) + } + } + .chartXScale(domain: window.start...window.end) + .chartYScale(domain: 0...1.0) + .chartXAxis { + AxisMarks(values: hourMarks) { _ in + AxisGridLine().foregroundStyle(P.grid) + } + } + .chartYAxis(.hidden) + .chartOverlay { proxy in + ZStack(alignment: .topLeading) { + ScrubOverlay(proxy: proxy, selection: $selection, clampTo: window) + if selection == nil, let nowX = proxy.position(forX: now) { + GeometryReader { geometry in + // Centred over the line, kept inside the chart. + Text(NSLocalizedString("Now", comment: "Carb entry time choice: eaten now")) + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.inkMuted) + .dynamicTypeSize(...DynamicTypeSize.xxxLarge) + .fixedSize() + .frame(width: 48) + .position(x: min(max(nowX, 24), geometry.size.width - 24), y: -Self.nowLabelHeight / 2) + .allowsHitTesting(false) + } + } + } + } + .overlay(alignment: .top) { + if let selection { + ScrubCallout(rows: scrubRows(at: selection)) + .offset(y: -Self.nowLabelHeight) + .allowsHitTesting(false) + } + } + .frame(height: Self.height) + .padding(.top, Self.nowLabelHeight) + .animation(reduceMotion ? nil : .snappy(duration: 0.35), value: grams) + .animation(reduceMotion ? nil : .snappy(duration: 0.35), value: absorptionTime) + .animation(reduceMotion ? nil : .snappy(duration: 0.35), value: eaten) + + AxisLabels(start: eaten.timeIntervalSince(window.start) / window.duration, end: absorbed.timeIntervalSince(window.start) / window.duration) { + Text(LoopFormat.time(eaten)) + .foregroundStyle(P.ink) + Text(String(format: NSLocalizedString("Absorbed by %1$@", comment: "Under the end of the carb absorption curve: when the carbs will have absorbed (1: time)"), LoopFormat.time(absorbed))) + .foregroundStyle(P.inkMuted) + } + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(String(format: NSLocalizedString("Eaten at %1$@, absorbed by %2$@", comment: "Accessibility summary of the carb entry preview chart (1: time eaten, 2: time absorbed)"), LoopFormat.time(eaten), LoopFormat.time(absorbed))) + } + + private func scrubRows(at date: Date) -> [ScrubCallout.Row] { + var rows: [ScrubCallout.Row] = [.init(label: nil, value: LoopFormat.time(date), color: P.ink)] + if grams > 0 { + let left = grams * (1 - Self.absorbedShare(date.timeIntervalSince(eaten) / max(absorptionTime, 1))) + rows.append(.init(label: NSLocalizedString("COB", comment: "Abbreviation for carbs on board (active carbohydrate)"), value: LoopFormat.grams(left), color: P.carbsInk)) + } + return rows + } +} + +/// Two labels on a time axis: the first starts at `start`, the second ends at `end`, pushed apart when they'd meet. +/// When they can't share a line, as at large text sizes, the second goes under the first. +private struct AxisLabels: Layout { + var start: Double + var end: Double + + private static let gap: CGFloat = 12 + + private func stacked(_ width: CGFloat, _ subviews: Subviews) -> Bool { + subviews.map { $0.sizeThatFits(.unspecified).width }.reduce(Self.gap, +) > width + } + + func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize { + let width = proposal.width ?? 0 + guard stacked(width, subviews) else { + return CGSize(width: width, height: subviews.map { $0.sizeThatFits(.unspecified).height }.max() ?? 0) + } + // Stacked labels wrap to the width rather than run off it. + let height = subviews.map { $0.sizeThatFits(ProposedViewSize(width: width, height: nil)).height }.reduce(0, +) + return CGSize(width: width, height: height) + } + + func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) { + guard subviews.count == 2 else { return } + if stacked(bounds.width, subviews) { + let wrapped = ProposedViewSize(width: bounds.width, height: nil) + let firstHeight = subviews[0].sizeThatFits(wrapped).height + subviews[0].place(at: CGPoint(x: bounds.minX, y: bounds.minY), proposal: wrapped) + subviews[1].place(at: CGPoint(x: bounds.minX, y: bounds.minY + firstHeight), proposal: wrapped) + return + } + let first = subviews[0].sizeThatFits(.unspecified) + let second = subviews[1].sizeThatFits(.unspecified) + let firstX = min(max(bounds.minX, bounds.minX + bounds.width * start), bounds.maxX - first.width) + let secondX = min(max(bounds.minX + bounds.width * end - second.width, firstX + first.width + Self.gap), bounds.maxX - second.width) + subviews[0].place(at: CGPoint(x: firstX, y: bounds.minY), proposal: ProposedViewSize(first)) + subviews[1].place(at: CGPoint(x: secondX, y: bounds.minY), proposal: ProposedViewSize(second)) + } +} diff --git a/Loop/Redesign/DayCharts.swift b/Loop/Redesign/DayCharts.swift new file mode 100644 index 0000000000..0b8350e73f --- /dev/null +++ b/Loop/Redesign/DayCharts.swift @@ -0,0 +1,660 @@ +// +// DayCharts.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import Charts +import UIKit + +private typealias P = LoopDesign.Palette + +// MARK: - Shared axis helpers + +enum DayAxis { + /// Midnight, 6 AM, noon and 6 PM inside `window`, by the clock, so a day when the clocks change still marks 6 AM. + static func quarterDayMarks(in window: DateInterval, calendar: Calendar = .current) -> [Date] { + var marks: [Date] = [] + var day = calendar.startOfDay(for: window.start) + while day <= window.end { + for hour in [0, 6, 12, 18] { + if let mark = calendar.date(bySettingHour: hour, minute: 0, second: 0, of: day), window.contains(mark) { + marks.append(mark) + } + } + guard let next = calendar.date(byAdding: .day, value: 1, to: day) else { break } + day = next + } + return marks + } + + static func hourLabel(_ date: Date) -> String { + date.formatted(.dateTime.hour()) + } + + /// Gaps of more than 30 minutes between readings, so a chart can say where data is missing. + static func gaps(in points: [GlucosePoint], window: DateInterval, until end: Date) -> [DateInterval] { + let limit: TimeInterval = 30 * 60 + var gaps: [DateInterval] = [] + var previous = window.start + for point in points.sorted(by: { $0.date < $1.date }) where window.contains(point.date) { + if point.date.timeIntervalSince(previous) > limit { + gaps.append(DateInterval(start: previous, end: point.date)) + } + previous = point.date + } + let last = min(end, window.end) + if last.timeIntervalSince(previous) > limit { + gaps.append(DateInterval(start: previous, end: last)) + } + return gaps + } + + static func gapMessage(_ gaps: [DateInterval], window: DateInterval, until end: Date) -> String? { + guard let longest = gaps.max(by: { $0.duration < $1.duration }) else { return nil } + // A gap over the whole period would read "0:00 – 0:00". + if gaps.count == 1, longest.start == window.start, longest.end == min(end, window.end) { + return window.contains(end) + ? NSLocalizedString("No CGM data yet today", comment: "Chart note: there are no glucose readings so far today") + : NSLocalizedString("No CGM data on this day", comment: "Chart note: there are no glucose readings for the whole day") + } + let start = LoopFormat.time(longest.start) + let end = LoopFormat.time(longest.end) + if gaps.count > 1 { + let others = String.localizedStringWithFormat(NSLocalizedString("%lld shorter gaps", comment: "Chart note: how many other, shorter gaps in glucose readings there were; follows the longest gap. (1: number of gaps)"), gaps.count - 1) + return String(format: NSLocalizedString("No CGM data %1$@ – %2$@ and %3$@", comment: "Chart note: the longest gap in glucose readings, plus the shorter ones. (1: start time; 2: end time; 3: number of shorter gaps, e.g. 2 shorter gaps)"), start, end, others) + } + return String(format: NSLocalizedString("No CGM data %1$@ – %2$@", comment: "Chart note: a gap in glucose readings. (1: start time; 2: end time)"), start, end) + } +} + +// MARK: - InsulinTimeline + +/// Carbs, glucose and insulin for one day on one shared time axis. +/// +/// The lanes are drawn in a single chart with stacked y ranges so they can't drift apart: insulin 0–30, +/// glucose 36–92 (the fixed 2–20 mmol/L scale), carb markers at 97. +struct InsulinTimelineView: View { + let history: DayHistory + let unit: GlucoseUnitStyle + let targetBands: [TargetBand] + var now: Date = Date() + var height: CGFloat = 260 + + @State private var selection: Date? + @Environment(\.colorScheme) private var colorScheme + + private static let insulinTop = 30.0 + private static let basalTop = 12.0 + private static let glucoseRange = 36.0...92.0 + private static let carbLane = 97.0 + + private var window: DateInterval { history.window } + + private func y(glucose mgdl: Double) -> Double { + let domain = unit.dayDomain + let value = min(max(unit.value(mgdl), domain.lowerBound), domain.upperBound) + let fraction = (value - domain.lowerBound) / (domain.upperBound - domain.lowerBound) + return Self.glucoseRange.lowerBound + fraction * (Self.glucoseRange.upperBound - Self.glucoseRange.lowerBound) + } + + private var maxBasal: Double { + max(0.5, (history.basal.map(\.rate) + history.scheduledBasal.map(\.rate)).max() ?? 0) + } + + private var maxBolus: Double { + max(1, history.boluses.map(\.units).max() ?? 0) + } + + private func y(basal rate: Double) -> Double { rate / maxBasal * Self.basalTop } + private func y(bolus units: Double) -> Double { max(1.5, units / maxBolus * (Self.insulinTop - 4)) } + + private var gaps: [DateInterval] { DayAxis.gaps(in: history.glucose, window: window, until: now) } + + /// Labels closer than this to the previous label are dropped so they don't overprint; the marks still draw. + private var labelSpacing: TimeInterval { window.duration / 7 } + + private func spacedIDs(_ items: [T], date: (T) -> Date, id: (T) -> String) -> Set { + var kept = Set() + var last: Date? + for item in items.sorted(by: { date($0) < date($1) }) { + if let last, date(item).timeIntervalSince(last) < labelSpacing { continue } + kept.insert(id(item)) + last = date(item) + } + return kept + } + + /// One label per run of carb entries closer together than `labelSpacing`, giving the run's total. + /// It sits after the run's last marker, so no later marker in the run draws over it. + private var carbLabels: [String: Double] { + var labels: [String: Double] = [:] + var runStart: Date? + var runLast: (id: String, total: Double)? + for carb in history.carbs.sorted(by: { $0.date < $1.date }) { + if let start = runStart, let last = runLast, carb.date.timeIntervalSince(start) < labelSpacing { + runLast = (carb.id, last.total + carb.grams) + } else { + if let last = runLast { labels[last.id] = last.total } + runStart = carb.date + runLast = (carb.id, carb.grams) + } + } + if let last = runLast { labels[last.id] = last.total } + return labels + } + private var labelledBoluses: Set { spacedIDs(history.boluses.filter { !$0.automatic }, date: \.date, id: \.id) } + + var body: some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + chart + .frame(height: height) + if let message = DayAxis.gapMessage(gaps, window: window, until: now), history.source == .loop || !history.glucose.isEmpty { + Text(message) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(LoopDesign.Palette.inkMuted) + } + } + } + + private var chart: some View { + Chart { + // Quarter-day rules + ForEach(DayAxis.quarterDayMarks(in: window), id: \.self) { mark in + RuleMark(x: .value("Time", mark)) + .foregroundStyle(P.grid) + .lineStyle(StrokeStyle(lineWidth: 1)) + } + + // Glucose lane + ForEach(Array(targetBands.enumerated()), id: \.offset) { _, band in + RectangleMark(xStart: .value("Start", band.start), xEnd: .value("End", band.end), + yStart: .value("Low", y(glucose: band.range.lowerBound)), yEnd: .value("High", y(glucose: band.range.upperBound))) + .foregroundStyle(P.targetBand) + } + ForEach(Array(history.glucose.enumerated()), id: \.offset) { _, point in + PointMark(x: .value("Time", point.date), y: .value("Glucose", y(glucose: point.mgdl))) + .symbolSize(10) + .foregroundStyle(P.glucose) + } + + // Carb markers + let carbLabels = carbLabels + ForEach(history.carbs) { carb in + PointMark(x: .value("Time", carb.date), y: .value("Carbs", Self.carbLane)) + .symbolSize(60) + .foregroundStyle(P.carbs) + .annotation(position: .trailing, spacing: 2) { + if let grams = carbLabels[carb.id] { + Text(LoopFormat.grams(grams)) + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.carbsInk) + } + } + } + + // Delivered basal, edged, then the schedule dashed over it + // Draw each recorded segment independently; a gap must not become an interpolated delivery area. + ForEach(Array(history.basal.enumerated()), id: \.offset) { _, segment in + RectangleMark(xStart: .value("Start", segment.start), xEnd: .value("End", segment.end), + yStart: .value("Base", 0), yEnd: .value("Basal", y(basal: segment.rate))) + .foregroundStyle(P.basal) + RuleMark(xStart: .value("Start", segment.start), xEnd: .value("End", segment.end), y: .value("Basal", y(basal: segment.rate))) + .foregroundStyle(P.basalEdge) + .lineStyle(StrokeStyle(lineWidth: 1.5)) + } + ForEach(Array(history.scheduledBasal.enumerated()), id: \.offset) { _, value in + RuleMark(xStart: .value("Start", value.start), xEnd: .value("End", value.end), y: .value("Scheduled", y(basal: value.rate))) + .foregroundStyle(P.basalScheduled) + .lineStyle(StrokeStyle(lineWidth: 1, dash: [3, 3])) + } + + // Boluses over basal: solid for manual with a label, hatched for automatic. + // Each sits in a card-coloured slot a point wider, so it never touches the basal behind it. + ForEach(history.boluses) { bolus in + RectangleMark(x: .value("Time", bolus.date), yStart: .value("Base", 0), yEnd: .value("Bolus", y(bolus: bolus.units)), width: .fixed(7)) + .foregroundStyle(P.surfaceRaised) + } + let bolusLabels = labelledBoluses + ForEach(history.boluses) { bolus in + if bolus.automatic { + RectangleMark(x: .value("Time", bolus.date), yStart: .value("Base", 0), yEnd: .value("Bolus", y(bolus: bolus.units)), width: .fixed(5)) + .foregroundStyle(Hatch.paint(P.bolus, scheme: colorScheme)) + } else { + RectangleMark(x: .value("Time", bolus.date), yStart: .value("Base", 0), yEnd: .value("Bolus", y(bolus: bolus.units)), width: .fixed(5)) + .foregroundStyle(P.bolus) + .annotation(position: .top, spacing: 2) { + if bolusLabels.contains(bolus.id) { + Text(LoopFormat.number(bolus.units, decimals: 1)) + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.insulinInk) + } + } + } + } + + // Now + if window.contains(now) { + RuleMark(x: .value("Now", now)) + .foregroundStyle(P.inkMuted) + .lineStyle(StrokeStyle(lineWidth: 1, dash: [2, 3])) + } + + if let selection { + RuleMark(x: .value("Selected", selection)) + .foregroundStyle(P.ink.opacity(0.6)) + .lineStyle(StrokeStyle(lineWidth: 1)) + } + } + .chartXScale(domain: window.start...window.end) + .chartYScale(domain: 0...104) + .chartXAxis { + AxisMarks(values: DayAxis.quarterDayMarks(in: window)) { value in + AxisValueLabel { + if let date = value.as(Date.self) { + Text(DayAxis.hourLabel(date)) + } + } + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.inkMuted) + } + } + .chartYAxis { + AxisMarks(position: .leading, values: unit.dayTicks.map { y(glucose: unit.mgdl($0)) }) { value in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel { + if let mapped = value.as(Double.self), let tick = unit.dayTicks.first(where: { abs(y(glucose: unit.mgdl($0)) - mapped) < 0.01 }) { + Text(tick.formatted()) + } + } + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.inkMuted) + } + } + .chartOverlay { proxy in + ScrubOverlay(proxy: proxy, selection: $selection, clampTo: window) + } + .overlay(alignment: .top) { + if let selection { + ScrubCallout(rows: scrubRows(at: selection)) + .padding(.top, 2) + .allowsHitTesting(false) + } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(accessibilitySummary) + } + + private func scrubRows(at date: Date) -> [ScrubCallout.Row] { + var rows: [ScrubCallout.Row] = [.init(label: nil, value: LoopFormat.time(date), color: P.ink)] + if let glucose = nearest(history.glucose.map { ($0.date, $0.mgdl) }, to: date, within: 10 * 60) { + rows.append(.init(label: NSLocalizedString("Glucose", comment: "Chart callout label for the glucose reading at the touched time"), value: "\(unit.format(glucose)) \(unit.unitName)", color: P.glucoseInk)) + } + if let iob = nearest(history.iob.map { ($0.date, $0.value) }, to: date, within: 10 * 60) { + rows.append(.init(label: NSLocalizedString("IOB", comment: "Abbreviation for insulin on board (active insulin)"), value: LoopFormat.doseUnits(iob), color: P.insulinInk)) + } + if let cob = nearest(history.cob.map { ($0.date, $0.value) }, to: date, within: 10 * 60) { + rows.append(.init(label: NSLocalizedString("COB", comment: "Abbreviation for carbs on board (active carbohydrate)"), value: LoopFormat.grams(cob), color: P.carbsInk)) + } + if let segment = LoopHistoryMath.basalRate(at: date, in: history.basal) { + let value = segment.kind == .suspended + ? NSLocalizedString("Suspended", comment: "Chart callout value: insulin delivery was suspended at the touched time") + : LoopFormat.rate(segment.rate) + rows.append(.init(label: NSLocalizedString("Basal", comment: "Chart callout label for the basal rate at the touched time"), value: value, color: P.ink)) + } + if let bolus = history.boluses.min(by: { abs($0.date.timeIntervalSince(date)) < abs($1.date.timeIntervalSince(date)) }), + abs(bolus.date.timeIntervalSince(date)) < 5 * 60 { + rows.append(.init(label: bolus.automatic + ? NSLocalizedString("Automatic bolus", comment: "Chart callout label for a bolus Loop delivered automatically near the touched time") + : NSLocalizedString("Bolus", comment: "Chart callout label for a bolus near the touched time"), + value: LoopFormat.doseUnits(bolus.units), color: P.insulinInk)) + } + return rows + } + + private var accessibilitySummary: String { + let day = LoopFormat.weekdayDay(window.start) + let bolus = LoopFormat.totalUnits(history.bolusUnits) + let basal = LoopFormat.totalUnits(history.basalUnits) + let carbs = LoopFormat.grams(history.carbGrams) + if let last = history.glucose.last { + return String(format: NSLocalizedString("Insulin timeline, %1$@, bolus %2$@, basal %3$@, carbs %4$@, latest glucose %5$@ %6$@", comment: "VoiceOver summary of the day's insulin timeline chart. (1: weekday and date; 2: bolus total, e.g. 12.5 U; 3: basal total; 4: carbs total, e.g. 140 g; 5: latest glucose value; 6: glucose unit, mmol/L or mg/dL)"), day, bolus, basal, carbs, unit.format(last.mgdl), unit.unitName) + } + return String(format: NSLocalizedString("Insulin timeline, %1$@, bolus %2$@, basal %3$@, carbs %4$@", comment: "VoiceOver summary of the day's insulin timeline chart with no glucose readings. (1: weekday and date; 2: bolus total, e.g. 12.5 U; 3: basal total; 4: carbs total, e.g. 140 g)"), day, bolus, basal, carbs) + } +} + +func nearest(_ values: [(Date, Double)], to date: Date, within limit: TimeInterval) -> Double? { + guard let best = values.min(by: { abs($0.0.timeIntervalSince(date)) < abs($1.0.timeIntervalSince(date)) }), + abs(best.0.timeIntervalSince(date)) <= limit else { + return nil + } + return best.1 +} + +// MARK: - Scrubbing + +/// Touch and hold then drag to scrub; a plain swipe still scrolls the page. +/// +/// A UIKit long-press recogniser is used because a SwiftUI long-press-then-drag gesture inside a table cell +/// takes every drag that starts on the chart, so the page couldn't scroll past it. +struct ScrubOverlay: View { + let proxy: ChartProxy + @Binding var selection: Date? + let clampTo: DateInterval + + var body: some View { + GeometryReader { geometry in + if #available(iOS 18.0, *) { + Color.clear + .contentShape(Rectangle()) + .gesture(ScrubPressRecognizer { location in + update(location, in: geometry) + } onEnd: { + selection = nil + }) + } else { + Color.clear + } + } + } + + private func update(_ location: CGPoint, in geometry: GeometryProxy) { + guard let frame = proxy.plotFrame else { return } + let origin = geometry[frame].origin + if let date: Date = proxy.value(atX: location.x - origin.x) { + selection = min(max(date, clampTo.start), clampTo.end) + } + } +} + +@available(iOS 18.0, *) +private struct ScrubPressRecognizer: UIGestureRecognizerRepresentable { + let onChange: (CGPoint) -> Void + let onEnd: () -> Void + + func makeUIGestureRecognizer(context: Context) -> UILongPressGestureRecognizer { + let recognizer = UILongPressGestureRecognizer() + recognizer.minimumPressDuration = 0.3 + recognizer.allowableMovement = 12 + return recognizer + } + + func handleUIGestureRecognizerAction(_ recognizer: UILongPressGestureRecognizer, context: Context) { + switch recognizer.state { + case .began, .changed: + onChange(context.converter.localLocation) + case .ended, .cancelled, .failed: + onEnd() + default: + break + } + } +} + +struct ScrubCallout: View { + struct Row: Hashable { + let label: String? + let value: String + let color: Color + } + + let rows: [Row] + + var body: some View { + VStack(alignment: .leading, spacing: 2) { + ForEach(rows, id: \.self) { row in + HStack(spacing: LoopDesign.Space.s1) { + if let label = row.label { + Text(label).foregroundStyle(P.inkMuted) + } + Text(row.value).foregroundStyle(row.color).fontWeight(.semibold) + } + } + } + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + .padding(.horizontal, LoopDesign.Space.s2) + .padding(.vertical, LoopDesign.Space.s1) + .background(P.surfaceRaised, in: RoundedRectangle(cornerRadius: LoopDesign.Radius.sm)) + .overlay(RoundedRectangle(cornerRadius: LoopDesign.Radius.sm).strokeBorder(P.separator)) + } +} + +// MARK: - Prediction + +/// The last three hours of readings and Loop's dashed prediction for the next three. +struct PredictionChartView: View { + let readings: [GlucosePoint] + let prediction: [GlucosePoint] + let unit: GlucoseUnitStyle + let targetBands: [TargetBand] + var now: Date = Date() + var height: CGFloat = 150 + + @State private var selection: Date? + + private var window: DateInterval { + DateInterval(start: now.addingTimeInterval(-3 * 3600), end: now.addingTimeInterval(3 * 3600)) + } + + private func clamp(_ mgdl: Double) -> Double { + min(max(unit.value(mgdl), unit.dayDomain.lowerBound), unit.dayDomain.upperBound) + } + + private var futurePrediction: [GlucosePoint] { + prediction.filter { $0.date >= now.addingTimeInterval(-5 * 60) && $0.date <= window.end } + } + + var body: some View { + Chart { + ForEach(Array(targetBands.enumerated()), id: \.offset) { _, band in + RectangleMark(xStart: .value("Start", band.start), xEnd: .value("End", band.end), + yStart: .value("Low", clamp(band.range.lowerBound)), yEnd: .value("High", clamp(band.range.upperBound))) + .foregroundStyle(P.targetBand) + } + ForEach(Array(readings.filter { window.contains($0.date) }.enumerated()), id: \.offset) { _, point in + PointMark(x: .value("Time", point.date), y: .value("Glucose", clamp(point.mgdl))) + .symbolSize(12) + .foregroundStyle(P.glucose) + } + ForEach(Array(futurePrediction.enumerated()), id: \.offset) { index, point in + LineMark(x: .value("Time", point.date), y: .value("Predicted", clamp(point.mgdl)), series: .value("Series", "prediction")) + .foregroundStyle(P.glucose) + .lineStyle(StrokeStyle(lineWidth: 1.5, dash: [4, 3])) + .annotation(position: .topTrailing, spacing: 0) { + if index == futurePrediction.count - 1 { + Text(unit.format(point.mgdl)) + .font(LoopDesign.Typeface.caption.weight(.semibold)) + .foregroundStyle(P.ink) + } + } + } + RuleMark(x: .value("Now", now)) + .foregroundStyle(P.inkMuted) + .lineStyle(StrokeStyle(lineWidth: 1, dash: [2, 3])) + if let selection { + RuleMark(x: .value("Selected", selection)) + .foregroundStyle(P.ink.opacity(0.6)) + } + } + .frame(height: height) + .chartXScale(domain: window.start...window.end) + .chartYScale(domain: unit.dayDomain) + .chartXAxis { + AxisMarks(values: [window.start, now, window.end]) { value in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel { + if let date = value.as(Date.self) { + Text(abs(date.timeIntervalSince(now)) < 60 ? NSLocalizedString("now", comment: "Prediction chart x-axis label marking the current time") : LoopFormat.time(date)) + } + } + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.inkMuted) + } + } + .chartYAxis { + AxisMarks(position: .leading, values: unit.dayTicks) { _ in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel().font(LoopDesign.Typeface.caption).foregroundStyle(P.inkMuted) + } + } + .chartOverlay { proxy in + ScrubOverlay(proxy: proxy, selection: $selection, clampTo: window) + } + .overlay(alignment: .top) { + if let selection { + ScrubCallout(rows: scrubRows(at: selection)).allowsHitTesting(false) + } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(accessibilitySummary) + } + + private func scrubRows(at date: Date) -> [ScrubCallout.Row] { + var rows: [ScrubCallout.Row] = [.init(label: nil, value: LoopFormat.time(date), color: P.ink)] + let source = date <= now ? readings : prediction + if let value = nearest(source.map { ($0.date, $0.mgdl) }, to: date, within: 10 * 60) { + rows.append(.init(label: date <= now + ? NSLocalizedString("Glucose", comment: "Chart callout label for the glucose reading at the touched time") + : NSLocalizedString("Predicted", comment: "Prediction chart callout label for Loop's predicted glucose at the touched time"), + value: "\(unit.format(value)) \(unit.unitName)", color: P.glucoseInk)) + } + return rows + } + + private var accessibilitySummary: String { + guard let last = futurePrediction.last else { + return NSLocalizedString("Glucose prediction unavailable", comment: "VoiceOver label for the prediction chart when Loop has no prediction") + } + return String(format: NSLocalizedString("Loop predicts %1$@ %2$@ by %3$@", comment: "VoiceOver summary of the prediction chart. (1: predicted glucose value; 2: glucose unit, mmol/L or mg/dL; 3: time of the prediction)"), unit.format(last.mgdl), unit.unitName, LoopFormat.time(last.date)) + } +} + +// MARK: - IOB and COB + +/// Insulin and carbs on board over the same window, each against its own coloured axis. +struct IOBCOBChartView: View { + let iob: [TimedValue] + let cob: [TimedValue] + let window: DateInterval + var now: Date = Date() + var height: CGFloat = 140 + + @State private var selection: Date? + + private var iobMax: Double { max(1, (iob.map(\.value).max() ?? 0) * 1.1) } + private var iobMin: Double { min(0, (iob.map(\.value).min() ?? 0) * 1.1) } + private var cobMax: Double { max(10, (cob.map(\.value).max() ?? 0) * 1.1) } + + /// COB drawn on the IOB scale. + private func scaled(cob value: Double) -> Double { value / cobMax * iobMax } + + private var iobTicks: [Double] { + let step = Self.niceStep(iobMax / 2) + return stride(from: (iobMin / step).rounded(.down) * step, through: iobMax, by: step).map { $0 } + } + + private var cobTicks: [Double] { + let step = Self.niceStep(cobMax / 2) + return stride(from: 0, through: cobMax, by: step).map { $0 } + } + + static func niceStep(_ raw: Double) -> Double { + guard raw > 0 else { return 1 } + let magnitude = pow(10, floor(log10(raw))) + let normalized = raw / magnitude + let nice: Double = normalized <= 1 ? 1 : normalized <= 2 ? 2 : normalized <= 5 ? 5 : 10 + return nice * magnitude + } + + var body: some View { + Chart { + RuleMark(y: .value("Zero", 0)) + .foregroundStyle(P.inkMuted) + .lineStyle(StrokeStyle(lineWidth: 1)) + + ForEach(Array(cob.enumerated()), id: \.offset) { _, value in + AreaMark(x: .value("Time", value.date), yStart: .value("Base", 0), yEnd: .value("COB", scaled(cob: value.value)), series: .value("Series", "cob-fill")) + .foregroundStyle(P.carbs.opacity(0.14)) + LineMark(x: .value("Time", value.date), y: .value("COB", scaled(cob: value.value)), series: .value("Series", value.date > now ? "cob-projected" : "cob")) + .foregroundStyle(P.carbs) + .lineStyle(StrokeStyle(lineWidth: 1.5, dash: value.date > now ? [4, 3] : [])) + } + ForEach(Array(iob.enumerated()), id: \.offset) { _, value in + AreaMark(x: .value("Time", value.date), yStart: .value("Base", 0), yEnd: .value("IOB", value.value), series: .value("Series", "iob-fill")) + .foregroundStyle(P.insulin.opacity(0.14)) + LineMark(x: .value("Time", value.date), y: .value("IOB", value.value), series: .value("Series", value.date > now ? "iob-projected" : "iob")) + .foregroundStyle(P.insulin) + .lineStyle(StrokeStyle(lineWidth: 1.5, dash: value.date > now ? [4, 3] : [])) + } + if window.contains(now) { + RuleMark(x: .value("Now", now)) + .foregroundStyle(P.inkMuted) + .lineStyle(StrokeStyle(lineWidth: 1, dash: [1, 3])) + } + if let selection { + RuleMark(x: .value("Selected", selection)).foregroundStyle(P.ink.opacity(0.6)) + } + } + .frame(height: height) + .chartXScale(domain: window.start...window.end) + .chartYScale(domain: iobMin...iobMax) + .chartXAxis { + AxisMarks(values: DayAxis.quarterDayMarks(in: window)) { value in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel { + if let date = value.as(Date.self) { Text(DayAxis.hourLabel(date)) } + } + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.inkMuted) + } + } + .chartYAxis { + AxisMarks(position: .leading, values: iobTicks) { value in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel { + if let v = value.as(Double.self) { Text(v.formatted(.number.precision(.fractionLength(0...1)))) } + } + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.insulinInk) + } + AxisMarks(position: .trailing, values: cobTicks.map { scaled(cob: $0) }) { value in + AxisValueLabel { + if let v = value.as(Double.self) { Text((v / iobMax * cobMax).formatted(.number.precision(.fractionLength(0)))) } + } + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.carbsInk) + } + } + .chartOverlay { proxy in + ScrubOverlay(proxy: proxy, selection: $selection, clampTo: window) + } + .overlay(alignment: .top) { + if let selection { + ScrubCallout(rows: scrubRows(at: selection)).allowsHitTesting(false) + } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(accessibilitySummary) + } + + private func scrubRows(at date: Date) -> [ScrubCallout.Row] { + var rows: [ScrubCallout.Row] = [.init(label: nil, value: LoopFormat.time(date), color: P.ink)] + if let value = nearest(iob.map { ($0.date, $0.value) }, to: date, within: 10 * 60) { + rows.append(.init(label: NSLocalizedString("IOB", comment: "Abbreviation for insulin on board (active insulin)"), value: LoopFormat.doseUnits(value), color: P.insulinInk)) + } + if let value = nearest(cob.map { ($0.date, $0.value) }, to: date, within: 10 * 60) { + rows.append(.init(label: NSLocalizedString("COB", comment: "Abbreviation for carbs on board (active carbohydrate)"), value: LoopFormat.grams(value), color: P.carbsInk)) + } + return rows + } + + private var accessibilitySummary: String { + let iobNow = nearest(iob.map { ($0.date, $0.value) }, to: now, within: 10 * 60) + let cobNow = nearest(cob.map { ($0.date, $0.value) }, to: now, within: 10 * 60) + let unknown = NSLocalizedString("unknown", comment: "VoiceOver value when active insulin or carbs at the current time isn't known") + return String(format: NSLocalizedString("Active insulin %1$@, active carbs %2$@", comment: "VoiceOver summary of the active insulin and carbs chart. (1: insulin on board, e.g. 1.25 U, or unknown; 2: carbs on board, e.g. 20 g, or unknown)"), iobNow.map(LoopFormat.doseUnits) ?? unknown, cobNow.map(LoopFormat.grams) ?? unknown) + } +} diff --git a/Loop/Redesign/DayDetailView.swift b/Loop/Redesign/DayDetailView.swift new file mode 100644 index 0000000000..c9966e7d1f --- /dev/null +++ b/Loop/Redesign/DayDetailView.swift @@ -0,0 +1,131 @@ +// +// DayDetailView.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import SwiftUI + +private typealias P = LoopDesign.Palette + +/// One full day on InsulinTimeline with IOB and COB under it, stepping a day at a time. +struct DayDetailView: View { + let provider: LoopHistoryProvider + + @State private var day: Date + @State private var history: DayHistory? + @State private var targetBands: [TargetBand] = [] + @State private var now = Date() + @State private var loadError: String? + + init(provider: LoopHistoryProvider, day: Date) { + self.provider = provider + _day = State(initialValue: Calendar.current.startOfDay(for: day)) + } + + private var window: DateInterval { + DateInterval(start: day, end: Calendar.current.date(byAdding: .day, value: 1, to: day)!) + } + + private var isToday: Bool { Calendar.current.isDate(day, inSameDayAs: now) } + + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: LoopDesign.Space.s6) { + dayStepper + if let history { + LoopCard { + CardHeader(title: NSLocalizedString("Insulin", comment: "Title of the day page card showing insulin, carbs and glucose on one timeline")) { + HStack(spacing: 4) { + Text(LoopFormat.totalUnits(history.totalUnits)).foregroundStyle(P.insulinInk) + Text("·") + Text(LoopFormat.grams(history.carbGrams)).foregroundStyle(P.carbsInk) + } + } + InsulinTimelineView(history: history, unit: provider.unitStyle, targetBands: targetBands, + now: now, height: 300) + ChartLegend(items: DayTotalsTiles.legend) + if history.source == .health { + Text(NSLocalizedString("From Apple Health: Loop keeps 7 days, so this day has no temp basal or schedule detail.", comment: "Day page note when the day is older than Loop's 7-day history and was read from Apple Health")) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + if #available(iOS 18.0, *) { + Text(NSLocalizedString("Touch and hold a chart to see exact values.", comment: "Hint under the day page charts explaining how to scrub them")) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + } + LoopCard { + CardHeader(title: NSLocalizedString("Basal and bolus", comment: "Trends card title: insulin split into basal and bolus")) + InsulinSplitView(split: history.insulinSplit, partial: isToday) + ValueTile(label: NSLocalizedString("Carbs", comment: "Label of a tile showing the day's total carbohydrate")) { + Text(LoopFormat.grams(history.carbGrams)) + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(P.carbsInk) + } + .fixedSize(horizontal: false, vertical: true) + } + LoopCard { + CardHeader(title: NSLocalizedString("Active insulin and carbs", comment: "Title of the day page card charting insulin and carbs on board")) + if history.iob.isEmpty && history.cob.isEmpty { + ChartPlaceholder(message: history.source == .health + ? NSLocalizedString("Loop only works out active insulin and carbs for the days it keeps", comment: "Day page placeholder for active insulin and carbs on a day older than Loop's 7-day history") + : NSLocalizedString("No active insulin or carbs on this day", comment: "Day page placeholder when there was no insulin or carbs on board all day")) + } else { + IOBCOBChartView(iob: history.iob, cob: history.cob, window: window, now: now) + } + ChartLegend(items: [ + LegendItem(swatch: .solid(P.insulin), label: NSLocalizedString("IOB (U, left)", comment: "Chart legend: insulin on board in units, on the left axis")), + LegendItem(swatch: .solid(P.carbs), label: NSLocalizedString("COB (g, right)", comment: "Chart legend: carbs on board in grams, on the right axis")), + LegendItem(swatch: .dash(P.inkMuted), label: NSLocalizedString("Projected", comment: "Chart legend: dashed lines show Loop's projection of insulin and carbs on board")), + ]) + } + } else if let loadError { + ChartPlaceholder(message: String(format: NSLocalizedString("Couldn't load this day: %1$@", comment: "Day page error when the day's history can't be read. (1: system error description)"), loadError)) + } else { + ProgressView() + .frame(maxWidth: .infinity, minHeight: 300) + } + } + .padding(LoopDesign.Space.s4) + } + .background(P.surface) + .navigationTitle(isToday ? NSLocalizedString("Today", comment: "Day page title when showing today") : LoopFormat.weekdayDay(day)) + .navigationBarTitleDisplayMode(.inline) + .task(id: day) { + now = Date() + let requestedWindow = window + history = nil + loadError = nil + do { + async let historyFetch = provider.dayHistory(requestedWindow) + async let targetsFetch = provider.glucoseTargetBands(in: requestedWindow) + let (result, targets) = try await (historyFetch, targetsFetch) + guard !Task.isCancelled, window == requestedWindow else { return } + history = result + targetBands = targets + } catch { + guard !Task.isCancelled, window == requestedWindow else { return } + loadError = error.localizedDescription + } + } + } + + private var dayStepper: some View { + HStack { + StepButton(systemName: "chevron.left", label: NSLocalizedString("Previous day", comment: "Accessibility label for the day page button that steps back a day")) { + day = Calendar.current.date(byAdding: .day, value: -1, to: day)! + } + Spacer() + Text(LoopFormat.day(day)) + .font(LoopDesign.Typeface.headline) + .foregroundStyle(P.ink) + Spacer() + StepButton(systemName: "chevron.right", label: NSLocalizedString("Next day", comment: "Accessibility label for the day page button that steps forward a day"), enabled: !isToday) { + day = Calendar.current.date(byAdding: .day, value: 1, to: day)! + } + } + } +} diff --git a/Loop/Redesign/LogbookScreen.swift b/Loop/Redesign/LogbookScreen.swift new file mode 100644 index 0000000000..25cec7b70b --- /dev/null +++ b/Loop/Redesign/LogbookScreen.swift @@ -0,0 +1,631 @@ +// +// LogbookScreen.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import LoopKit +import LoopKitUI + +private typealias P = LoopDesign.Palette + +/// One row of the logbook. +struct LogEntry: Identifiable { + enum Filter: String, CaseIterable, Identifiable { + case all = "All" + case bolus = "Bolus" + case basal = "Basal" + case carbs = "Carbs" + case loop = "Loop" + var id: String { rawValue } + + var title: String { + switch self { + case .all: return NSLocalizedString("All", comment: "Logbook filter chip: show every entry") + case .bolus: return NSLocalizedString("Bolus", comment: "Logbook filter chip: show only boluses") + case .basal: return NSLocalizedString("Basal", comment: "Logbook filter chip: show only basal changes") + case .carbs: return NSLocalizedString("Carbs", comment: "Logbook filter chip: show only carb entries") + case .loop: return NSLocalizedString("Loop", comment: "Logbook filter chip: show only what Loop did automatically (Loop is the app's name)") + } + } + } + + enum Action { + case deleteCarbs(StoredCarbEntry) + case deleteDose(DoseEntry) + } + + let id: String + let date: Date + let title: String + let subtitle: String + let amount: String + let amountColor: Color + let detail: String + let icon: String + let iconStyle: IconTile.Style + let filters: Set + /// Loop's own small, frequent doses: the amount is set lighter so the person's own entries stand out. + var quiet = false + var basalChanges: [BasalSegment] = [] + var edit: StoredCarbEntry? = nil + var delete: Action? = nil + /// Units of a single automatic bolus, so runs of them can be folded into one row. + var automaticUnits: Double? = nil + /// The automatic boluses a folded row stands for, newest first. + var bolusRun: [LogEntry] = [] + + func matches(_ filter: Filter) -> Bool { + filter == .all || filters.contains(filter) + } +} + +struct LogDay: Identifiable { + let day: Date + let entries: [LogEntry] + let insulin: InsulinSplit + let carbs: Double + var id: Date { day } +} + +@MainActor +final class LogbookModel: ObservableObject { + @Published private(set) var days: [LogDay] = [] + @Published private(set) var loaded = false + @Published var filter: LogEntry.Filter = .all + @Published var error: String? + @Published private(set) var loadError: String? + @Published private(set) var carbEditingAllowed = false + + let provider: LoopHistoryProvider + private var loadTask: Task? + + init(provider: LoopHistoryProvider) { + self.provider = provider + } + + func reload() { + loadTask?.cancel() + carbEditingAllowed = provider.allowsCarbEditing + loadError = nil + loadTask = Task { + do { + let result = try await Self.build(provider: provider) + guard !Task.isCancelled else { return } + self.days = result + } catch { + guard !Task.isCancelled else { return } + self.days = [] + self.loadError = error.localizedDescription + } + self.loaded = true + } + } + + func perform(_ action: LogEntry.Action) { + Task { + do { + switch action { + case .deleteCarbs(let entry): + guard provider.allowsCarbEditing else { return } + try await provider.delete(carb: entry) + case .deleteDose(let dose): try await provider.delete(dose: dose) + } + reload() + } catch { + self.error = error.localizedDescription + } + } + } + + // MARK: Building rows + + private static func build(provider: LoopHistoryProvider, now: Date = Date()) async throws -> [LogDay] { + let calendar = Calendar.current + let start = calendar.startOfDay(for: provider.localHistoryStart.addingTimeInterval(86400)) + let interval = DateInterval(start: start, end: now) + async let historyFetch = provider.dayHistory(interval, includeOnBoard: false) + async let pumpFetch = provider.pumpEvents(since: start) + let history = try await historyFetch + let pumpEvents = try await pumpFetch + let unit = provider.unitStyle + let canDelete = FeatureFlags.entryDeletionEnabled + + return LoopHistoryMath.days(in: interval).reversed().map { day in + var entries: [LogEntry] = [] + let inDay: (Date) -> Bool = { $0 >= day.start && $0 < day.end } + let carbsToday = history.carbs.filter { inDay($0.date) } + + for bolus in history.boluses where inDay(bolus.date) { + let glucose = glucoseContext(at: bolus.date, history.glucose, unit: unit, withTrend: bolus.automatic) + var parts = [bolus.automatic ? sourceLoop : sourceManual] + if !bolus.automatic, let meal = carbsToday.first(where: { abs($0.date.timeIntervalSince(bolus.date)) <= 15 * 60 }) { + parts.append(LoopFormat.grams(meal.grams)) + } + if let glucose { parts.append(glucose) } + if bolus.manuallyEntered { parts.append(NSLocalizedString("logged", comment: "Logbook bolus row detail: the dose was logged by hand rather than delivered by the pump")) } + entries.append(LogEntry( + id: "bolus-\(bolus.id)", date: bolus.date, + title: bolus.automatic + ? NSLocalizedString("Automatic bolus", comment: "Logbook row title: a bolus Loop delivered automatically") + : NSLocalizedString("Bolus", comment: "Logbook row title: a bolus"), + subtitle: joined(parts), + amount: LoopFormat.doseUnits(bolus.units), amountColor: P.insulinInk, + detail: LoopFormat.time(bolus.date), + icon: bolus.automatic ? "arrow.triangle.2.circlepath" : "syringe.fill", + iconStyle: bolus.automatic ? .hatch(P.bolus) : .solid(P.bolus), + filters: bolus.automatic ? [.bolus, .loop] : [.bolus], + quiet: bolus.automatic, + delete: canDelete && bolus.manuallyEntered ? bolus.dose.map { .deleteDose($0) } : nil, + automaticUnits: bolus.automatic && !bolus.manuallyEntered ? bolus.units : nil)) + } + + for carb in carbsToday { + var parts = [carb.createdByLoop ? sourceManual : NSLocalizedString("Health", comment: "Logbook carb row detail: the entry came from Apple Health")] + if let food = carb.foodType, !food.isEmpty { parts.append(food) } + if let hours = carb.absorptionHours { parts.append(String(format: NSLocalizedString("absorbs over %1$@ h", comment: "Logbook carb row detail: carb absorption time in hours. (1: hours, e.g. 3 or 2.5)"), hours.formatted(.number.precision(.fractionLength(0...1))))) } + let editable = carb.createdByLoop && provider.allowsCarbEditing ? carb.entry : nil + entries.append(LogEntry( + id: "carbs-\(carb.id)", date: carb.date, + title: NSLocalizedString("Carbs", comment: "Logbook row title: a carb entry"), subtitle: joined(parts), + amount: LoopFormat.grams(carb.grams), amountColor: P.carbsInk, + detail: LoopFormat.time(carb.date), + icon: "fork.knife", iconStyle: .solid(P.carbs), filters: [.carbs], + edit: editable, + delete: canDelete ? editable.map { .deleteCarbs($0) } : nil)) + } + + let segments = history.basal.compactMap { $0.clamped(to: day) } + let automaticTemps = segments.filter { $0.kind == .temp && $0.automatic } + if let latest = automaticTemps.last { + let net = automaticTemps.reduce(0) { $0 + $1.netUnits } + let count = automaticTemps.count + entries.append(LogEntry( + id: "basal-\(day.start.timeIntervalSince1970)", date: latest.start, + title: NSLocalizedString("Basal adjustments", comment: "Logbook row title summarising the temp basals Loop set in a day"), + subtitle: String.localizedStringWithFormat(NSLocalizedString("Loop · %lld changes · tap to list", comment: "Logbook basal adjustments row subtitle: how many temp basals Loop set in the day; tapping lists them. (1: number of changes)"), count), + amount: String(format: NSLocalizedString("%1$@ U", comment: "Format string for an amount of insulin in units. (1: amount)"), LoopFormat.signed(net, decimals: 1)), amountColor: P.ink, + detail: NSLocalizedString("vs plan", comment: "Logbook basal adjustments row: the insulin amount is the difference from the scheduled basal"), + icon: "waveform.path.ecg", iconStyle: .basal, filters: [.basal, .loop], + basalChanges: automaticTemps.reversed())) + } + for temp in segments where temp.kind == .temp && !temp.automatic { + entries.append(LogEntry( + id: "temp-\(temp.start.timeIntervalSince1970)", date: temp.start, + title: NSLocalizedString("Temp basal", comment: "Logbook row title: a temporary basal rate"), + subtitle: String(format: NSLocalizedString("Manual · %1$@", comment: "Logbook temp basal row subtitle: set by hand, then the rate and how long. (1: description, e.g. 0.50 U/h for 30m (scheduled 0.80))"), describe(temp)), + amount: LoopFormat.rate(temp.rate), amountColor: P.ink, + detail: LoopFormat.time(temp.start), + icon: "waveform.path.ecg", iconStyle: .basal, filters: [.basal])) + } + for suspend in segments where suspend.kind == .suspended { + var parts = [suspend.automatic ? sourceLoop : sourceManual, LoopFormat.duration(suspend.end.timeIntervalSince(suspend.start))] + if let glucose = glucoseContext(at: suspend.start, history.glucose, unit: unit, withTrend: false) { parts.append(glucose) } + entries.append(LogEntry( + id: "suspend-\(suspend.start.timeIntervalSince1970)", date: suspend.start, + title: NSLocalizedString("Basal suspended", comment: "Logbook row title: insulin delivery was suspended"), subtitle: joined(parts), + amount: String(format: NSLocalizedString("%1$@ U/h", comment: "Format string for an insulin rate in units per hour. (1: rate)"), LoopFormat.number(0, decimals: 0)), amountColor: P.ink, + detail: LoopFormat.time(suspend.start), + icon: "pause.fill", iconStyle: .solid(P.statusWarning), + filters: suspend.automatic ? [.basal, .loop] : [.basal])) + } + + for event in pumpEvents where inDay(event.date) { + let title: String + switch event.kind { + // Site change and alarm names come from the pump plugin as it reports them. + case .siteChange(let name): title = name + case .alarm(let name): title = name + case .resume: title = NSLocalizedString("Basal resumed", comment: "Logbook row title: insulin delivery resumed after a suspend") + } + entries.append(LogEntry( + id: "pump-\(event.id)", date: event.date, + title: title, subtitle: NSLocalizedString("Pump", comment: "Logbook row subtitle: the event was reported by the insulin pump"), + amount: "", amountColor: P.ink, + detail: LoopFormat.time(event.date), + icon: "circle.dashed", iconStyle: .solid(P.inkMuted.opacity(0.5)), filters: [])) + } + + let insulin = InsulinSplit(basal: segments.reduce(0) { $0 + $1.units }, boluses: history.boluses.filter { inDay($0.date) }) + return LogDay(day: day.start, entries: foldingAutomaticBoluses(entries.sorted { $0.date > $1.date }), insulin: insulin, + carbs: carbsToday.reduce(0) { $0 + $1.grams }) + } + } + + /// Loop gives many small automatic boluses; two or more in a row, with nothing else logged between them, become + /// one row that lists them. The day's Basal adjustments summary row is dated by its latest change, not where it + /// falls, so it doesn't break a run. + static func foldingAutomaticBoluses(_ entries: [LogEntry]) -> [LogEntry] { + var result: [LogEntry] = [] + var run: [LogEntry] = [] + var summaries: [LogEntry] = [] + + func flush() { + if run.count >= 2, let newest = run.first, let oldest = run.last { + let units = run.reduce(0) { $0 + ($1.automaticUnits ?? 0) } + result.append(LogEntry( + id: "autorun-\(newest.id)", date: newest.date, + title: NSLocalizedString("Automatic boluses", comment: "Logbook row title: several automatic boluses in a row, folded into one row that lists them"), + subtitle: String(format: NSLocalizedString("Loop · %1$@ · tap to list", comment: "Logbook folded automatic boluses row subtitle: Loop gave them, the time span they cover, and tapping lists them. (1: time range, e.g. 15:08 – 16:14)"), + "\(LoopFormat.time(oldest.date))–\(LoopFormat.time(newest.date))"), + amount: LoopFormat.doseUnits(units), amountColor: P.insulinInk, + detail: String.localizedStringWithFormat(NSLocalizedString("%lld doses", comment: "Logbook folded automatic boluses row: how many automatic boluses it holds. (1: number)"), run.count), + icon: "arrow.triangle.2.circlepath", iconStyle: .hatch(P.bolus), + filters: [.bolus, .loop], quiet: true, + bolusRun: run)) + } else { + result.append(contentsOf: run) + } + run = [] + } + + for entry in entries { + if entry.automaticUnits != nil { + run.append(entry) + } else if !entry.basalChanges.isEmpty { + summaries.append(entry) + } else { + flush() + result.append(entry) + } + } + flush() + // Put the summary rows back in date order. + return (result + summaries).sorted { $0.date > $1.date } + } + + private static var sourceLoop: String { + NSLocalizedString("Loop", comment: "Logbook row detail: Loop made this change automatically (Loop is the app's name)") + } + + private static var sourceManual: String { + NSLocalizedString("Manual", comment: "Logbook row detail: the user made this entry or change by hand") + } + + /// Row details are a list of independent facts ("Manual", "45 g", "glucose 7.5"), shown with a middle-dot separator. + private static func joined(_ parts: [String]) -> String { + parts.joined(separator: " · ") + } + + static func describe(_ segment: BasalSegment) -> String { + let rate = LoopFormat.rate(segment.rate) + let duration = LoopFormat.duration(segment.end.timeIntervalSince(segment.start)) + if let scheduled = segment.scheduledRate { + return String(format: NSLocalizedString("%1$@ for %2$@ (scheduled %3$@)", comment: "A temp basal: its rate, how long it ran and the scheduled rate it replaced. (1: rate, e.g. 0.50 U/h; 2: duration, e.g. 30m; 3: scheduled rate number, e.g. 0.80)"), rate, duration, LoopFormat.number(scheduled, decimals: 2)) + } + return String(format: NSLocalizedString("%1$@ for %2$@", comment: "A temp basal: its rate and how long it ran. (1: rate, e.g. 0.50 U/h; 2: duration, e.g. 30m)"), rate, duration) + } + + /// "glucose 7.5", or "glucose 11.0 rising" for Loop's own doses. + private static func glucoseContext(at date: Date, _ readings: [GlucosePoint], unit: GlucoseUnitStyle, withTrend: Bool) -> String? { + guard let reading = readings.last(where: { $0.date <= date.addingTimeInterval(60) }), date.timeIntervalSince(reading.date) <= 10 * 60 else { + return nil + } + let value = unit.format(reading.mgdl) + if withTrend, let earlier = readings.last(where: { $0.date <= reading.date.addingTimeInterval(-14 * 60) }), + reading.date.timeIntervalSince(earlier.date) <= 20 * 60 { + let perFifteen = (reading.mgdl - earlier.mgdl) / reading.date.timeIntervalSince(earlier.date) * 900 + if perFifteen > 10 { + return String(format: NSLocalizedString("glucose %1$@ rising", comment: "Logbook row detail: glucose when the dose was given, and rising. (1: glucose value, e.g. 11.0)"), value) + } else if perFifteen < -10 { + return String(format: NSLocalizedString("glucose %1$@ falling", comment: "Logbook row detail: glucose when the dose was given, and falling. (1: glucose value, e.g. 11.0)"), value) + } + } + return String(format: NSLocalizedString("glucose %1$@", comment: "Logbook row detail: glucose when the dose was given. (1: glucose value, e.g. 7.5)"), value) + } +} + +// MARK: - Screen + +struct LogbookView: View { + @StateObject private var model: LogbookModel + @State private var path: [Route] = [] + /// Editing is a sheet, as adding carbs is on Now: pushed here, the tab bar covered the bolus screen's button. + @State private var editingCarbs: CarbEditRoute? + @Environment(\.dynamicTypeSize) private var typeSize + private let deviceManager: DeviceDataManager + + enum Route: Hashable { + case basal(String) + case boluses(String) + } + + struct CarbEditRoute: Identifiable { + let id = UUID() + let entry: StoredCarbEntry + } + + init(provider: LoopHistoryProvider, deviceManager: DeviceDataManager) { + _model = StateObject(wrappedValue: LogbookModel(provider: provider)) + self.deviceManager = deviceManager + } + + private var visibleDays: [LogDay] { + model.days.map { day in + LogDay(day: day.day, entries: day.entries.filter { $0.matches(model.filter) }, insulin: day.insulin, carbs: day.carbs) + } + } + + var body: some View { + NavigationStack(path: $path) { + List { + Section { + chips + .listRowInsets(EdgeInsets()) + .listRowBackground(Color.clear) + } + if let error = model.loadError { + Text(String(format: NSLocalizedString("Couldn't load Logbook: %1$@", comment: "Logbook error when its history can't be read. (1: system error description)"), error)).foregroundStyle(P.criticalInk) + Button(NSLocalizedString("Retry", comment: "Button to try loading the Logbook again")) { model.reload() } + } else if model.loaded && model.days.allSatisfy({ $0.entries.isEmpty }) { + Text(NSLocalizedString("Nothing logged in the last 7 days.", comment: "Logbook empty state when there are no entries at all")) + .foregroundStyle(P.inkMuted) + } + ForEach(visibleDays) { day in + Section { + if day.entries.isEmpty { + Text(model.filter != .all + ? NSLocalizedString("Nothing to show for this filter", comment: "Logbook day with no entries matching the selected filter") + : day.insulin.total > 0 + ? NSLocalizedString("Scheduled basal only", comment: "Logbook day where only the scheduled basal ran, with nothing else logged") + : NSLocalizedString("Nothing logged", comment: "Logbook day with no entries")) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + ForEach(day.entries) { entry in + row(entry) + } + } header: { + dayHeader(day) + } + } + Section { + EmptyView() + } footer: { + Text(NSLocalizedString("Loop keeps the last 7 days on this phone. Older doses and carbs are in Apple Health and on the Trends tab.", comment: "Logbook footer explaining why only 7 days are listed")) + } + } + .listStyle(.insetGrouped) + .scrollContentBackground(.hidden) + .background(P.surface) + .navigationTitle(NSLocalizedString("Logbook", comment: "Title of the Logbook tab")) + .refreshable { model.reload() } + .overlay { + if !model.loaded { ProgressView() } + } + .navigationDestination(for: Route.self) { route in + destination(route) + } + } + .sheet(item: $editingCarbs) { route in + NavigationStack { + LogbookCarbEditor(entry: route.entry, deviceManager: deviceManager, provider: model.provider) { + editingCarbs = nil + model.reload() + } + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { + Button(NSLocalizedString("Cancel", comment: "Button label for cancel")) { editingCarbs = nil } + } + } + } + } + .onAppear { model.reload() } + .onReceive(NotificationCenter.default.publisher(for: .LoopDataUpdated).debounce(for: .seconds(2), scheduler: RunLoop.main)) { _ in + model.reload() + } + .alert(NSLocalizedString("Couldn't delete", comment: "Alert title when deleting a Logbook entry fails"), isPresented: Binding(get: { model.error != nil }, set: { if !$0 { model.error = nil } })) { + Button(NSLocalizedString("OK", comment: "Button to dismiss the Logbook delete error alert"), role: .cancel) {} + } message: { + Text(model.error ?? "") + } + } + + private var chips: some View { + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: LoopDesign.Space.s2) { + ForEach(LogEntry.Filter.allCases) { filter in + Button { + model.filter = filter + } label: { + Text(filter.title) + .font(LoopDesign.Typeface.footnote.weight(.semibold)) + .padding(.horizontal, 12) + .padding(.vertical, 6) + .foregroundStyle(model.filter == filter ? Color(uiColor: .systemBackground) : P.ink) + .background(model.filter == filter ? P.ink : P.surfaceSunken, in: Capsule()) + } + .buttonStyle(.plain) + .accessibilityAddTraits(model.filter == filter ? .isSelected : []) + } + } + .padding(.vertical, LoopDesign.Space.s1) + } + } + + private func dayHeader(_ day: LogDay) -> some View { + let calendar = Calendar.current + let date = LoopFormat.weekdayDay(day.day) + let title = calendar.isDateInToday(day.day) + ? String(format: NSLocalizedString("Today · %1$@", comment: "Logbook day header for today. (1: weekday and date, e.g. Sun 25 Oct)"), date) + : calendar.isDateInYesterday(day.day) + ? String(format: NSLocalizedString("Yesterday · %1$@", comment: "Logbook day header for yesterday. (1: weekday and date, e.g. Sat 24 Oct)"), date) + : date + return VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + let totals = HStack(spacing: LoopDesign.Space.s3) { + if day.insulin.total > 0 { + Text(LoopFormat.totalUnits(day.insulin.total)) + .foregroundStyle(P.insulinInk) + } + Text(LoopFormat.grams(day.carbs)) + .foregroundStyle(P.carbsInk) + } + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + .fixedSize() + // The totals drop under the date when both won't fit on one line, rather than breaking numbers apart. + ViewThatFits(in: .horizontal) { + HStack(alignment: .firstTextBaseline) { + Text(title) + .font(LoopDesign.Typeface.headline) + .foregroundStyle(P.ink) + .fixedSize() + Spacer() + totals + } + VStack(alignment: .leading, spacing: LoopDesign.Space.s1) { + Text(title) + .font(LoopDesign.Typeface.headline) + .foregroundStyle(P.ink) + totals + } + } + if day.insulin.total > 0 { + // The day's total sits on the line above, so the key keeps to one line. + InsulinSplitLine(split: day.insulin, partial: calendar.isDateInToday(day.day)) + } + } + .padding(.bottom, 2) + .textCase(nil) + .accessibilityElement(children: .combine) + } + + @ViewBuilder + private func row(_ entry: LogEntry) -> some View { + // At accessibility sizes the amount moves under the title, so neither column squeezes the other into fragments. + let stacked = typeSize.isAccessibilitySize + let titles = VStack(alignment: .leading, spacing: 2) { + Text(entry.title) + .font(LoopDesign.Typeface.body) + .foregroundStyle(P.ink) + Text(entry.subtitle) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + let amounts = VStack(alignment: stacked ? .leading : .trailing, spacing: 2) { + if !entry.amount.isEmpty { + Text(entry.amount) + .font(LoopDesign.Typeface.body.weight(entry.quiet ? .regular : .semibold).monospacedDigit()) + .foregroundStyle(entry.amountColor) + } + Text(entry.detail) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + let content = HStack(alignment: stacked ? .top : .center, spacing: LoopDesign.Space.s3) { + IconTile(systemName: entry.icon, style: entry.iconStyle) + if stacked { + VStack(alignment: .leading, spacing: LoopDesign.Space.s1) { + titles + amounts + } + Spacer(minLength: 0) + } else { + titles + Spacer(minLength: LoopDesign.Space.s2) + amounts + } + } + .accessibilityElement(children: .combine) + + if !entry.basalChanges.isEmpty { + NavigationLink(value: Route.basal(entry.id)) { content } + } else if !entry.bolusRun.isEmpty { + NavigationLink(value: Route.boluses(entry.id)) { content } + } else { + content + .swipeActions(edge: .trailing, allowsFullSwipe: false) { + if let action = entry.delete, canPerform(action) { + Button(role: .destructive) { model.perform(action) } label: { Label(NSLocalizedString("Delete", comment: "Swipe action to delete a Logbook entry"), systemImage: "trash") } + } + if let carb = entry.edit, model.carbEditingAllowed { + Button { + guard model.provider.allowsCarbEditing else { return } + editingCarbs = CarbEditRoute(entry: carb) + } label: { Label(NSLocalizedString("Edit", comment: "Swipe action to edit a Logbook carb entry"), systemImage: "pencil") } + .tint(P.accent) + } + } + } + } + + private func canPerform(_ action: LogEntry.Action) -> Bool { + switch action { + case .deleteCarbs: return model.carbEditingAllowed + case .deleteDose: return true + } + } + + @ViewBuilder + private func destination(_ route: Route) -> some View { + switch route { + case .basal(let id): + if let entry = model.days.flatMap(\.entries).first(where: { $0.id == id }) { + BasalChangesList(changes: entry.basalChanges) + } + case .boluses(let id): + if let entry = model.days.flatMap(\.entries).first(where: { $0.id == id }) { + List(entry.bolusRun) { bolus in + row(bolus) + } + .navigationTitle(NSLocalizedString("Automatic boluses", comment: "Logbook row title: several automatic boluses in a row, folded into one row that lists them")) + .navigationBarTitleDisplayMode(.inline) + } + } + } +} + +/// Own the draft independently of rows that refresh while the editor or its bolus screen is open. +private struct LogbookCarbEditor: View { + @StateObject private var viewModel: CarbEntryViewModel + let deviceManager: DeviceDataManager + let provider: LoopHistoryProvider + let dismiss: () -> Void + + init(entry: StoredCarbEntry, deviceManager: DeviceDataManager, provider: LoopHistoryProvider, dismiss: @escaping () -> Void) { + _viewModel = StateObject(wrappedValue: provider.carbEntryViewModel(editing: entry)) + self.deviceManager = deviceManager + self.provider = provider + self.dismiss = dismiss + } + + var body: some View { + CarbEntryScreen(viewModel: viewModel) + .environmentObject(deviceManager.displayGlucosePreference) + .environment(\.dismissAction, dismiss) + .navigationTitle(NSLocalizedString("Edit Carb Entry", comment: "Title of the screen for editing a carb entry from the Logbook")) + .navigationBarTitleDisplayMode(.inline) + .onAppear { if !provider.allowsCarbEditing { dismiss() } } + // Loop posts this from its data queue; SwiftUI faults on publishers that emit off the main thread. + .onReceive(NotificationCenter.default.publisher(for: .LoopDataUpdated).receive(on: RunLoop.main)) { _ in + if !provider.allowsCarbEditing { dismiss() } + } + } +} + +/// Every basal change Loop made in a day. +struct BasalChangesList: View { + let changes: [BasalSegment] + + var body: some View { + List(Array(changes.enumerated()), id: \.offset) { _, change in + HStack { + VStack(alignment: .leading, spacing: 2) { + Text(LoopFormat.time(change.start)) + .font(LoopDesign.Typeface.body) + Text(LogbookModel.describe(change)) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + Spacer() + Text(String(format: NSLocalizedString("%1$@ U", comment: "Format string for an amount of insulin in units. (1: amount)"), LoopFormat.signed(change.netUnits))) + .font(LoopDesign.Typeface.body.weight(.semibold).monospacedDigit()) + .foregroundStyle(P.insulinInk) + } + .accessibilityElement(children: .combine) + } + .navigationTitle(NSLocalizedString("Basal adjustments", comment: "Title of the list of every temp basal Loop set in a day")) + .navigationBarTitleDisplayMode(.inline) + } +} diff --git a/Loop/Redesign/LoopDesign.swift b/Loop/Redesign/LoopDesign.swift new file mode 100644 index 0000000000..6639707372 --- /dev/null +++ b/Loop/Redesign/LoopDesign.swift @@ -0,0 +1,432 @@ +// +// LoopDesign.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import UIKit + +/// The tokens from the Loop design system (`design/project/tokens.json`). +/// +/// Quantity colours reuse Loop's existing assets (`glucose`, `insulin`, `carbs`, `fresh`, `warning`, `accent`) +/// so a DerivedAssetsOverride still recolours them. Grounds and text map onto the iOS system colours they +/// were taken from; the rest are colour sets in DerivedAssetsBase.xcassets named after their token. +/// +/// Insulin and carb amounts are set in `insulinInk` and `carbsInk` wherever they stand alone. Glucose, basal, +/// counts and figures beside a legend swatch stay `ink`. Red is only for something that needs action now. +enum LoopDesign { + + enum Palette { + // Grounds + static let surface = Color(uiColor: .systemGroupedBackground) + static let surfaceRaised = Color(uiColor: .secondarySystemGroupedBackground) + static let surfaceSunken = Color(uiColor: .systemGray5) + static let controlThumb = Color("control-thumb") + static let separator = Color(uiColor: .opaqueSeparator) + static let grid = Color(uiColor: .systemGray5) + + // Text + static let ink = Color(uiColor: .label) + static let inkMuted = Color("ink-muted") + static let accent = Color("accent") + static let accentInk = Color("accent-ink") + static let onFill = Color.black + + // Quantities + static let glucose = Color("glucose") + static let glucoseInk = Color("glucose-ink") + static let targetBand = Color("target-band") + static let agpOuter = Color("agp-outer") + static let agpInner = Color("agp-inner") + /// Insulin as a quantity and an action: the Bolus button and the active insulin curve. + static let insulin = Color("insulin") + /// Every insulin amount set as text, whether a bolus, a day's total or active insulin. + static let insulinInk = Color("insulin-ink") + static let basal = Color("basal") + static let basalEdge = Color("basal-edge") + /// Basal is a pale, quiet orange with a tan edge; bolus is insulin's orange made deep. Both stay orange, + /// and their lightness is far enough apart (3:1 even where they touch) to tell them apart at a glance. + static let bolus = Color("bolus") + static let basalScheduled = inkMuted + static let carbs = Color("carbs") + static let carbsInk = Color("carbs-ink") + + // Time in range ladder, top to bottom + static let rangeVeryHigh = Color("range-very-high") + static let rangeHigh = Color("range-high") + static let rangeIn = Color("range-in") + static let rangeLow = Color("range-low") + static let rangeVeryLow = Color("range-very-low") + + // Loop state + static let statusAutomated = Color("fresh") + static let statusWarning = Color("warning") + static let statusCritical = Color("status-critical") + static let criticalInk = Color("critical-ink") + } + + enum Space { + static let s1: CGFloat = 4 + static let s2: CGFloat = 8 + static let s3: CGFloat = 12 + static let s4: CGFloat = 16 + static let s6: CGFloat = 24 + static let s8: CGFloat = 32 + } + + enum Radius { + static let sm: CGFloat = 6 + static let md: CGFloat = 10 + static let lg: CGFloat = 14 + } + + /// Text styles follow Dynamic Type; the large numbers are fixed sizes in SF Pro Rounded with tabular figures. + enum Typeface { + static let glucoseHero = Font.system(size: 64, weight: .bold, design: .rounded).monospacedDigit() + static let statValue = Font.system(.title, design: .rounded).weight(.semibold).monospacedDigit() + static let statValueSmall = Font.system(.title3, design: .rounded).weight(.semibold).monospacedDigit() + static let title = Font.title.bold() + static let headline = Font.headline + static let body = Font.body + static let subhead = Font.subheadline + static let footnote = Font.footnote + static let caption = Font.caption2.weight(.medium).monospacedDigit() + } +} + +// MARK: - Card + +struct LoopCard: View { + var padding: CGFloat = LoopDesign.Space.s4 + @ViewBuilder var content: Content + + var body: some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s3) { + content + } + .padding(padding) + .frame(maxWidth: .infinity, alignment: .leading) + .background(LoopDesign.Palette.surfaceRaised, in: RoundedRectangle(cornerRadius: LoopDesign.Radius.lg, style: .continuous)) + } +} + +/// A card title with an optional trailing detail or action, as on every card in the mock-ups. +struct CardHeader: View { + let title: String + @ViewBuilder var trailing: Trailing + + var body: some View { + HStack(alignment: .firstTextBaseline) { + Text(title) + .font(LoopDesign.Typeface.headline) + .foregroundStyle(LoopDesign.Palette.ink) + .accessibilityAddTraits(.isHeader) + Spacer(minLength: LoopDesign.Space.s2) + trailing + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(LoopDesign.Palette.inkMuted) + } + } +} + +extension CardHeader where Trailing == EmptyView { + init(title: String) { + self.init(title: title) { EmptyView() } + } +} + +// MARK: - Legend + +struct LegendItem: Identifiable { + enum Swatch { + case solid(Color) + case outline(Color) + case dash(Color) + case dot(Color) + case hatch(Color) + case basal + } + + let id = UUID() + let swatch: Swatch + let label: String +} + +struct ChartLegend: View { + let items: [LegendItem] + + var body: some View { + FlowLayout(spacing: LoopDesign.Space.s3, lineSpacing: LoopDesign.Space.s1) { + ForEach(items) { item in + HStack(spacing: LoopDesign.Space.s1) { + LegendSwatch(swatch: item.swatch) + Text(item.label) + } + .accessibilityElement(children: .combine) + } + } + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(LoopDesign.Palette.inkMuted) + } +} + +/// The 10-point key for one kind of mark, shared by legends and the basal and bolus rows. +struct LegendSwatch: View { + let swatch: LegendItem.Swatch + @Environment(\.colorScheme) private var scheme + + var body: some View { + switch swatch { + case .solid(let color): + RoundedRectangle(cornerRadius: 2).fill(color).frame(width: 10, height: 10) + case .outline(let color): + RoundedRectangle(cornerRadius: 2).strokeBorder(color, lineWidth: 1.5).frame(width: 10, height: 10) + case .dash(let color): + Path { path in + path.move(to: CGPoint(x: 0, y: 1)) + path.addLine(to: CGPoint(x: 14, y: 1)) + } + .stroke(color, style: StrokeStyle(lineWidth: 2, dash: [4, 2])) + .frame(width: 14, height: 2) + case .dot(let color): + Circle().fill(color).frame(width: 8, height: 8) + case .hatch(let color): + RoundedRectangle(cornerRadius: 2).fill(Hatch.paint(color, scheme: scheme)).frame(width: 10, height: 10) + case .basal: + VStack(spacing: 0) { + Rectangle().fill(LoopDesign.Palette.basalEdge).frame(height: 2) + Rectangle().fill(LoopDesign.Palette.basal) + } + .frame(width: 10, height: 10) + .clipShape(RoundedRectangle(cornerRadius: 2)) + } + } +} + +/// Diagonal stripes over a pale tint of a colour: automatic bolus, wherever a mark is wide enough to show it. +enum Hatch { + static func paint(_ color: Color, scheme: ColorScheme) -> ImagePaint { + let resolved = UIColor(color).resolvedColor(with: UITraitCollection(userInterfaceStyle: scheme == .dark ? .dark : .light)) + let size: CGFloat = 5 + let image = UIGraphicsImageRenderer(size: CGSize(width: size, height: size)).image { context in + resolved.withAlphaComponent(scheme == .dark ? 0.3 : 0.22).setFill() + context.fill(CGRect(x: 0, y: 0, width: size, height: size)) + resolved.setStroke() + // One stripe corner to corner, plus the ends of its neighbours, so tiles join into unbroken lines. + let path = UIBezierPath() + path.lineWidth = 1.4 + for offset in [-size, 0, size] { + path.move(to: CGPoint(x: offset, y: size)) + path.addLine(to: CGPoint(x: offset + size, y: 0)) + } + path.stroke() + } + return ImagePaint(image: Image(uiImage: image)) + } +} + +/// Wraps its children onto new lines, for legends and chips. +struct FlowLayout: Layout { + var spacing: CGFloat + var lineSpacing: CGFloat + + func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize { + let width = proposal.width ?? .infinity + var x: CGFloat = 0, y: CGFloat = 0, lineHeight: CGFloat = 0, maxX: CGFloat = 0 + for subview in subviews { + let size = subview.sizeThatFits(.unspecified) + if x > 0 && x + size.width > width { + x = 0 + y += lineHeight + lineSpacing + lineHeight = 0 + } + x += size.width + spacing + maxX = max(maxX, x - spacing) + lineHeight = max(lineHeight, size.height) + } + return CGSize(width: maxX, height: y + lineHeight) + } + + func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) { + var x = bounds.minX, y = bounds.minY, lineHeight: CGFloat = 0 + for subview in subviews { + let size = subview.sizeThatFits(.unspecified) + if x > bounds.minX && x + size.width > bounds.maxX { + x = bounds.minX + y += lineHeight + lineSpacing + lineHeight = 0 + } + subview.place(at: CGPoint(x: x, y: y), proposal: ProposedViewSize(size)) + x += size.width + spacing + lineHeight = max(lineHeight, size.height) + } + } +} + +/// A row that stacks vertically at accessibility text sizes, so tiles and buttons keep their numbers on one line. +struct AdaptiveRow: View { + @Environment(\.dynamicTypeSize) private var typeSize + var spacing: CGFloat = LoopDesign.Space.s2 + @ViewBuilder var content: Content + + var body: some View { + let layout = typeSize.isAccessibilitySize + ? AnyLayout(VStackLayout(alignment: .leading, spacing: spacing)) + : AnyLayout(HStackLayout(spacing: spacing)) + layout { content } + } +} + +// MARK: - Pills and tiles + +struct StatusPill: View { + let text: String + var dot: Color? = nil + + var body: some View { + HStack(spacing: LoopDesign.Space.s1) { + if let dot { + Circle().fill(dot).frame(width: 8, height: 8) + } + Text(text) + .lineLimit(1) + } + .font(LoopDesign.Typeface.footnote.weight(.medium)) + .foregroundStyle(LoopDesign.Palette.ink) + .padding(.horizontal, 10) + .padding(.vertical, 5) + .background(LoopDesign.Palette.surfaceSunken, in: Capsule()) + } +} + +/// A small sunken tile with a label over a value, as used under the hero and the timeline. +struct ValueTile: View { + let label: String + @ViewBuilder var value: Value + + var body: some View { + VStack(alignment: .leading, spacing: 2) { + Text(label) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(LoopDesign.Palette.inkMuted) + .lineLimit(1) + .minimumScaleFactor(0.7) + .allowsTightening(true) + // A value with a long unit ("0.04 単位") shrinks to fit rather than breaking mid-word. + value + .lineLimit(1) + .minimumScaleFactor(0.6) + } + .padding(LoopDesign.Space.s3) + .frame(maxWidth: .infinity, minHeight: 64, maxHeight: .infinity, alignment: .topLeading) + .background(LoopDesign.Palette.surfaceSunken, in: RoundedRectangle(cornerRadius: LoopDesign.Radius.md, style: .continuous)) + .accessibilityElement(children: .combine) + } +} + +/// The square icon tile at the start of logbook rows. +/// +/// Insulin tiles are drawn the way the charts draw the same insulin, so a row and its mark read alike: manual bolus +/// solid, automatic bolus hatched, basal pale with its edge. +struct IconTile: View { + enum Style { + case solid(Color) + case hatch(Color) + case basal + } + + let systemName: String + let style: Style + @Environment(\.colorScheme) private var scheme + + init(systemName: String, fill: Color) { + self.systemName = systemName + self.style = .solid(fill) + } + + init(systemName: String, style: Style) { + self.systemName = systemName + self.style = style + } + + private var shape: RoundedRectangle { RoundedRectangle(cornerRadius: LoopDesign.Radius.sm, style: .continuous) } + + var body: some View { + Image(systemName: systemName) + .font(.system(size: isHatched ? 11 : 13, weight: .bold)) + .foregroundStyle(glyph) + // Stripes behind a glyph blur it, so the hatched tile sets its glyph on a plain disc. + .frame(width: isHatched ? 18 : 28, height: isHatched ? 18 : 28) + .background { if isHatched { Circle().fill(LoopDesign.Palette.surfaceRaised) } } + .frame(width: 28, height: 28) + .background { background } + .accessibilityHidden(true) + } + + private var isHatched: Bool { + if case .hatch = style { return true } + return false + } + + private var glyph: Color { + switch style { + case .solid: return LoopDesign.Palette.onFill + case .hatch, .basal: return LoopDesign.Palette.insulinInk + } + } + + @ViewBuilder + private var background: some View { + switch style { + case .solid(let fill): + shape.fill(fill) + case .hatch(let color): + shape.fill(Hatch.paint(color, scheme: scheme)) + .overlay(shape.strokeBorder(color, lineWidth: 1.5)) + case .basal: + shape.fill(LoopDesign.Palette.basal) + .overlay(shape.strokeBorder(LoopDesign.Palette.basalEdge, lineWidth: 1.5)) + } + } +} + +/// The round previous and next buttons beside a date or period. +struct StepButton: View { + let systemName: String + let label: String + var enabled = true + let action: () -> Void + + var body: some View { + Button(action: action) { + Image(systemName: systemName) + .font(.footnote.weight(.semibold)) + .frame(width: 30, height: 30) + .background(LoopDesign.Palette.surfaceRaised, in: Circle()) + .overlay(Circle().strokeBorder(LoopDesign.Palette.separator)) + .frame(width: 44, height: 44) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .foregroundStyle(enabled ? LoopDesign.Palette.ink : LoopDesign.Palette.inkMuted.opacity(0.5)) + .disabled(!enabled) + .accessibilityLabel(label) + } +} + +/// A message in place of a chart that has nothing to draw, saying why. +struct ChartPlaceholder: View { + let message: String + var height: CGFloat = 120 + + var body: some View { + Text(message) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(LoopDesign.Palette.inkMuted) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity, minHeight: height) + .background(LoopDesign.Palette.surfaceSunken.opacity(0.5), in: RoundedRectangle(cornerRadius: LoopDesign.Radius.md)) + } +} diff --git a/Loop/Redesign/LoopHistoryMath.swift b/Loop/Redesign/LoopHistoryMath.swift new file mode 100644 index 0000000000..5e4a10df90 --- /dev/null +++ b/Loop/Redesign/LoopHistoryMath.swift @@ -0,0 +1,403 @@ +// +// LoopHistoryMath.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import Foundation + +/// Pure calculations behind the Trends and Logbook screens. Nothing here touches a store. +enum LoopHistoryMath { + + // MARK: Glucose statistics + + struct GlucoseStats: Equatable { + let count: Int + let meanMgdl: Double + let sdMgdl: Double + /// Coefficient of variation, 0–1. + let cv: Double + /// Glucose management indicator, as a percentage (Bergenstal 2018). + let gmiPercent: Double + var gmiMmolMol: Double { (gmiPercent - 2.152) * 10.929 } + } + + static func glucoseStats(_ points: [GlucosePoint]) -> GlucoseStats? { + guard points.count >= 2 else { return nil } + let values = points.map(\.mgdl) + let mean = values.reduce(0, +) / Double(values.count) + let variance = values.reduce(0) { $0 + pow($1 - mean, 2) } / Double(values.count - 1) + let sd = variance.squareRoot() + return GlucoseStats(count: values.count, meanMgdl: mean, sdMgdl: sd, cv: sd / mean, gmiPercent: 3.31 + 0.02392 * mean) + } + + /// The share of the period with CGM readings, assuming one reading every 5 minutes. + static func cgmActiveFraction(_ points: [GlucosePoint], over interval: DateInterval) -> Double { + let expected = interval.duration / 300 + guard expected > 0 else { return 0 } + return min(1, Double(points.count) / expected) + } + + // MARK: Time in range + + enum RangeBand: Int, CaseIterable, Identifiable { + case veryHigh, high, inRange, low, veryLow + + var id: Int { rawValue } + + var name: String { + switch self { + case .veryHigh: return NSLocalizedString("Very high", comment: "Time-in-range band name: glucose above 250 mg/dL (13.9 mmol/L)") + case .high: return NSLocalizedString("High", comment: "Time-in-range band name: glucose 181–250 mg/dL (10.1–13.9 mmol/L)") + case .inRange: return NSLocalizedString("In range", comment: "Time-in-range band name: glucose 70–180 mg/dL (3.9–10.0 mmol/L)") + case .low: return NSLocalizedString("Low", comment: "Time-in-range band name: glucose 54–69 mg/dL (3.0–3.8 mmol/L)") + case .veryLow: return NSLocalizedString("Very low", comment: "Time-in-range band name: glucose below 54 mg/dL (3.0 mmol/L)") + } + } + + /// Consensus thresholds, in the person's unit. + /// Numbers go through the user's locale ("3,9–10,0" in German); the symbols are not words, so they stay in code. + func thresholds(_ unit: GlucoseUnitStyle) -> String { + let d = unit.isMmol ? 1 : 0 + func n(_ value: Double) -> String { LoopFormat.number(value, decimals: d) } + switch (self, unit.isMmol) { + case (.veryHigh, true): return "> " + n(13.9) + case (.high, true): return n(10.1) + "–" + n(13.9) + case (.inRange, true): return n(3.9) + "–" + n(10.0) + case (.low, true): return n(3.0) + "–" + n(3.8) + case (.veryLow, true): return "< " + n(3.0) + case (.veryHigh, false): return "> " + n(250) + case (.high, false): return n(181) + "–" + n(250) + case (.inRange, false): return n(70) + "–" + n(180) + case (.low, false): return n(54) + "–" + n(69) + case (.veryLow, false): return "< " + n(54) + } + } + + static func band(for mgdl: Double) -> RangeBand { + switch mgdl { + case ..<54: return .veryLow + case ..<70: return .low + case ...180: return .inRange + case ...250: return .high + default: return .veryHigh + } + } + } + + /// Fractions (0–1) per band, in ladder order. Empty input gives all zeros. + static func timeInRange(_ points: [GlucosePoint]) -> [RangeBand: Double] { + var counts: [RangeBand: Int] = [:] + for point in points { + counts[RangeBand.band(for: point.mgdl), default: 0] += 1 + } + let total = Double(points.count) + return Dictionary(uniqueKeysWithValues: RangeBand.allCases.map { band in + (band, total > 0 ? Double(counts[band] ?? 0) / total : 0) + }) + } + + /// Whole-number percentages that add up to 100 (largest remainder), so the labels never sum to 99 or 101. + static func roundedPercentages(_ fractions: [RangeBand: Double]) -> [RangeBand: Int] { + let raw = RangeBand.allCases.map { (band: $0, value: (fractions[$0] ?? 0) * 100) } + let total = raw.reduce(0) { $0 + $1.value } + guard total > 0 else { return Dictionary(uniqueKeysWithValues: RangeBand.allCases.map { ($0, 0) }) } + var floors = raw.map { (band: $0.band, floor: Int($0.value.rounded(.down)), remainder: $0.value - $0.value.rounded(.down)) } + var missing = Int(total.rounded()) - floors.reduce(0) { $0 + $1.floor } + for index in floors.indices.sorted(by: { floors[$0].remainder > floors[$1].remainder }) where missing > 0 { + floors[index].floor += 1 + missing -= 1 + } + return Dictionary(uniqueKeysWithValues: floors.map { ($0.band, $0.floor) }) + } + + // MARK: AGP + + struct AGPSlot: Equatable { + /// Minutes after midnight at the start of the slot. + let minute: Int + let p5: Double + let p25: Double + let p50: Double + let p75: Double + let p95: Double + } + + /// Readings folded onto one day in `slotMinutes` slots, as mg/dL percentiles. Slots with fewer than 3 readings are skipped. + static func agp(_ points: [GlucosePoint], slotMinutes: Int = 15, calendar: Calendar = .current) -> [AGPSlot] { + var slots: [Int: [Double]] = [:] + for point in points { + let parts = calendar.dateComponents([.hour, .minute], from: point.date) + let minute = (parts.hour ?? 0) * 60 + (parts.minute ?? 0) + slots[minute / slotMinutes, default: []].append(point.mgdl) + } + return slots.keys.sorted().compactMap { key in + let values = slots[key]!.sorted() + guard values.count >= 3 else { return nil } + return AGPSlot(minute: key * slotMinutes, + p5: percentile(values, 0.05), p25: percentile(values, 0.25), p50: percentile(values, 0.5), + p75: percentile(values, 0.75), p95: percentile(values, 0.95)) + } + } + + /// Linear-interpolated percentile of sorted values. + static func percentile(_ sorted: [Double], _ p: Double) -> Double { + guard !sorted.isEmpty else { return .nan } + let position = p * Double(sorted.count - 1) + let lower = Int(position.rounded(.down)), upper = Int(position.rounded(.up)) + let weight = position - Double(lower) + return sorted[lower] * (1 - weight) + sorted[upper] * weight + } + + /// The number of distinct calendar days with readings. + static func daysWithReadings(_ points: [GlucosePoint], calendar: Calendar = .current) -> Int { + Set(points.map { calendar.startOfDay(for: $0.date) }).count + } + + /// Whole days from the first reading to the end of `interval`, when that falls short of the period by more than a + /// day; nil when the readings span the period, or there are none. + static func cgmCoveredDays(_ points: [GlucosePoint], in interval: DateInterval, periodDays: Int) -> Int? { + guard periodDays > 1, let first = points.map(\.date).min() else { return nil } + let available = interval.end.timeIntervalSince(first) / 86400 + guard available + 1 < Double(periodDays) else { return nil } + return max(1, Int(available.rounded())) + } + + /// Units the schedule would deliver over `span`, or nil where the points don't cover all of it. + static func scheduledUnits(_ points: [ScheduledBasalPoint], over span: DateInterval) -> Double? { + var units = 0.0 + var covered: TimeInterval = 0 + for point in points { + let overlap = min(point.end, span.end).timeIntervalSince(max(point.start, span.start)) + guard overlap > 0 else { continue } + units += point.rate * overlap / 3600 + covered += overlap + } + return covered >= span.duration - 60 ? units : nil + } + + // MARK: Days + + /// Midnight-to-midnight intervals covering `interval`, oldest first, the last one cut off at `interval.end`. + static func days(in interval: DateInterval, calendar: Calendar = .current) -> [DateInterval] { + var result: [DateInterval] = [] + var start = calendar.startOfDay(for: interval.start) + while start < interval.end { + guard let next = calendar.date(byAdding: .day, value: 1, to: start) else { break } + result.append(DateInterval(start: max(start, interval.start), end: min(next, interval.end))) + start = next + } + return result + } + + struct DayTotal: Equatable, Identifiable { + let day: Date + let split: InsulinSplit + /// False for a day still in progress, so its partial total doesn't pull per-day averages down. + var isComplete = true + var id: Date { day } + var basal: Double { split.basal } + var bolus: Double { split.bolus } + var total: Double { split.total } + + init(day: Date, split: InsulinSplit, isComplete: Bool = true) { + self.day = day + self.split = split + self.isComplete = isComplete + } + + /// A total with no manual or automatic detail: all of its bolus counts as manual. + init(day: Date, basal: Double, bolus: Double, isComplete: Bool = true) { + self.init(day: day, split: InsulinSplit(basal: basal, manualBolus: bolus), isComplete: isComplete) + } + } + + /// The days per-day insulin figures average over: days with insulin, leaving out a day still in progress + /// unless no complete day has any. + static func averagingDays(_ totals: [DayTotal]) -> [DayTotal] { + let recorded = totals.filter { $0.total > 0 } + let complete = recorded.filter(\.isComplete) + return complete.isEmpty ? recorded : complete + } + + /// One source for the summary, legend and chart rule, before any weekly aggregation. + static func averageDailyInsulin(_ totals: [DayTotal]) -> Double { + let days = averagingDays(totals) + guard !days.isEmpty else { return 0 } + return days.reduce(0) { $0 + $1.total } / Double(days.count) + } + + /// Averages daily totals by calendar week (Monday start), for periods past 30 days. + static func weekly(_ totals: [DayTotal], calendar: Calendar = .current) -> [DayTotal] { + var cal = calendar + cal.firstWeekday = 2 + let groups = Dictionary(grouping: totals) { cal.dateInterval(of: .weekOfYear, for: $0.day)?.start ?? $0.day } + return groups.keys.sorted().map { week in + DayTotal(day: week, split: InsulinSplit.average(averagingDays(groups[week]!).map(\.split))) + } + } + + // MARK: Basal + + struct ScheduleValue { + let start: Date + let end: Date + let rate: Double + } + + /// A basal record from the pump: scheduled delivery, a temp basal or a suspend. + struct BasalDelivery { + let start: Date + let end: Date + /// U/h; 0 for a suspend. + let rate: Double + let kind: BasalSegment.Kind + let automatic: Bool + } + + /// Delivered basal over `window` from the pump's records (the latest-starting one wins where they overlap). + /// + /// From `recordsStart` on, time without a basal record counts at `programmedRates`, since that is what the pump + /// delivers on its own; this matches Loop's own insulin totals (`InsulinDeliveryHistory`). Before it, or without + /// it, gaps stay unknown. + static func basalSegments(window: DateInterval, schedule: [ScheduleValue], deliveries temps: [BasalDelivery], + programmedRates: [ScheduleValue] = [], recordsStart: Date? = nil) -> [BasalSegment] { + var cuts = Set([window.start, window.end]) + if let recordsStart, window.contains(recordsStart) { cuts.insert(recordsStart) } + for value in schedule + programmedRates { + if window.contains(value.start) { cuts.insert(value.start) } + if window.contains(value.end) { cuts.insert(value.end) } + } + for temp in temps { + if window.contains(temp.start) { cuts.insert(temp.start) } + if window.contains(temp.end) { cuts.insert(temp.end) } + } + let sorted = cuts.sorted() + let sortedTemps = temps.sorted { $0.start < $1.start } + // The furthest end among records up to each index bounds the backward search, so a week of five-minute + // records stays linear rather than scanning every record for every cut. + var furthestEnd: [Date] = [] + furthestEnd.reserveCapacity(sortedTemps.count) + for temp in sortedTemps { furthestEnd.append(max(furthestEnd.last ?? temp.end, temp.end)) } + func latestRecord(covering mid: Date) -> BasalDelivery? { + var low = 0, high = sortedTemps.count + while low < high { + let middle = (low + high) / 2 + if sortedTemps[middle].start <= mid { low = middle + 1 } else { high = middle } + } + var index = low - 1 + while index >= 0, furthestEnd[index] > mid { + if mid < sortedTemps[index].end { return sortedTemps[index] } + index -= 1 + } + return nil + } + var segments: [BasalSegment] = [] + for (a, b) in zip(sorted, sorted.dropFirst()) where b > a { + let mid = a.addingTimeInterval(b.timeIntervalSince(a) / 2) + let scheduled = schedule.first { $0.start <= mid && mid < $0.end }?.rate + let segment: BasalSegment + if let temp = latestRecord(covering: mid) { + segment = BasalSegment(start: a, end: b, rate: temp.kind == .suspended ? 0 : temp.rate, scheduledRate: scheduled, + kind: temp.kind, automatic: temp.automatic) + } else if let recordsStart, a >= recordsStart, + let programmed = programmedRates.first(where: { $0.start <= mid && mid < $0.end })?.rate { + segment = BasalSegment(start: a, end: b, rate: programmed, scheduledRate: scheduled, kind: .scheduled, automatic: false) + } else { + continue + } + if let last = segments.last, last.end == segment.start, last.rate == segment.rate, last.kind == segment.kind, + last.scheduledRate == segment.scheduledRate, last.automatic == segment.automatic { + segments[segments.count - 1] = BasalSegment(start: last.start, end: segment.end, rate: last.rate, + scheduledRate: last.scheduledRate, kind: last.kind, automatic: last.automatic) + } else { + segments.append(segment) + } + } + return segments + } + + /// Basal rate at a moment, from delivered segments. + static func basalRate(at date: Date, in segments: [BasalSegment]) -> BasalSegment? { + segments.last { $0.start <= date && date < $0.end } + } + + // MARK: Loop modes + + struct LoopRun { + let date: Date + let succeeded: Bool + let error: String? + } + + struct ModeChange: Codable, Equatable { + let date: Date + let closedLoop: Bool + } + + /// Splits `interval` into closed, limited and open stretches. + /// + /// Each 5-minute slot is open when closed loop was switched off (from `modeChanges`), closed when Loop completed a + /// run in the 15 minutes before the slot ends, and limited otherwise. Before the first mode change the setting is + /// unknown, so the result starts at the later of `coverageStart` and the first mode change. + static func loopModeSpans(interval: DateInterval, runs: [LoopRun], modeChanges: [ModeChange], coverageStart: Date?, + recency: TimeInterval = 15 * 60, slot: TimeInterval = 5 * 60) -> [LoopModeSpan] { + guard let coverageStart, let firstChange = modeChanges.map(\.date).min() else { return [] } + let start = max(interval.start, coverageStart, firstChange) + guard interval.end > start else { return [] } + + let sortedRuns = runs.sorted { $0.date < $1.date } + let changes = modeChanges.sorted { $0.date < $1.date } + var spans: [LoopModeSpan] = [] + var runIndex = 0 + var lastSuccess: Date? = nil + var lastError: String? = nil + var changeIndex = 0 + var closedSetting: Bool? = nil + + var t = start + while t < interval.end { + let slotEnd = min(t.addingTimeInterval(slot), interval.end) + while runIndex < sortedRuns.count && sortedRuns[runIndex].date <= slotEnd { + let run = sortedRuns[runIndex] + if run.succeeded { + lastSuccess = run.date + lastError = nil + } else { + lastError = run.error ?? lastError + } + runIndex += 1 + } + while changeIndex < changes.count && changes[changeIndex].date <= slotEnd { + closedSetting = changes[changeIndex].closedLoop + changeIndex += 1 + } + + let mode: LoopModeSpan.Mode + let cause: String? + if closedSetting == false { + mode = .open + cause = NSLocalizedString("Closed loop off", comment: "Reason shown for a stretch of time when Loop was in open loop because closed loop was turned off") + } else if let lastSuccess, slotEnd.timeIntervalSince(lastSuccess) <= recency { + mode = .closed + cause = nil + } else { + mode = .limited + cause = lastError ?? NSLocalizedString("Loop didn't run", comment: "Reason shown for a stretch of time when Loop did not complete a run and recorded no error") + } + + if let last = spans.last, last.mode == mode, last.cause == cause, last.end == t { + spans[spans.count - 1] = LoopModeSpan(start: last.start, end: slotEnd, mode: mode, cause: cause) + } else { + spans.append(LoopModeSpan(start: t, end: slotEnd, mode: mode, cause: cause)) + } + t = slotEnd + } + return spans + } + + static func duration(of mode: LoopModeSpan.Mode, in spans: [LoopModeSpan]) -> TimeInterval { + spans.filter { $0.mode == mode }.reduce(0) { $0 + $1.duration } + } +} diff --git a/Loop/Redesign/LoopHistoryModels.swift b/Loop/Redesign/LoopHistoryModels.swift new file mode 100644 index 0000000000..387c320f3f --- /dev/null +++ b/Loop/Redesign/LoopHistoryModels.swift @@ -0,0 +1,366 @@ +// +// LoopHistoryModels.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import Foundation +import HealthKit +import LoopKit +import LoopAlgorithm + +/// Plain value types the redesigned screens draw from. Glucose is kept in mg/dL and converted only for display, +/// so the statistics don't depend on the display unit. + +struct GlucosePoint: Equatable { + let date: Date + let mgdl: Double + /// A fingerstick or other reading typed in: drawn on charts, but left out of CGM statistics. + var userEntered = false +} + +struct BolusEvent: Equatable, Identifiable { + let id: String + let date: Date + let units: Double + /// Issued by Loop (automatic bolus) rather than by the person. + let automatic: Bool + /// Logged in Loop by hand rather than delivered by the pump; these can be deleted. + let manuallyEntered: Bool + /// Kept so a manually entered dose can be deleted from the dose store. + var dose: DoseEntry? = nil + /// False when the record doesn't say whether Loop or the person gave it, such as another app's doses in Apple Health. + var automaticKnown = true + + static func == (lhs: BolusEvent, rhs: BolusEvent) -> Bool { + lhs.id == rhs.id && lhs.date == rhs.date && lhs.units == rhs.units && lhs.automatic == rhs.automatic + } +} + +struct BasalSegment: Equatable { + enum Kind: Equatable { + /// The scheduled rate, with no temp basal running. + case scheduled + /// A temp basal, set by Loop or by hand. + case temp + case suspended + } + + let start: Date + let end: Date + /// The rate actually delivered, in U/h. + let rate: Double + /// The profile rate at the time, in U/h, if known. + let scheduledRate: Double? + let kind: Kind + let automatic: Bool + + var hours: Double { end.timeIntervalSince(start) / 3600 } + var units: Double { rate * hours } + /// Units delivered above (positive) or below (negative) the schedule. + var netUnits: Double { + guard let scheduledRate else { return 0 } + return (rate - scheduledRate) * hours + } + + func clamped(to interval: DateInterval) -> BasalSegment? { + let s = max(start, interval.start), e = min(end, interval.end) + guard e > s else { return nil } + return BasalSegment(start: s, end: e, rate: rate, scheduledRate: scheduledRate, kind: kind, automatic: automatic) + } +} + +struct ScheduledBasalPoint: Equatable { + let start: Date + let end: Date + let rate: Double +} + +/// The correction range over part of a chart, in mg/dL. +struct TargetBand: Equatable { + let start: Date + let end: Date + let range: ClosedRange +} + +struct CarbEvent: Equatable, Identifiable { + let id: String + let date: Date + let grams: Double + let absorptionHours: Double? + let foodType: String? + let createdByLoop: Bool + /// Kept so the entry can be edited or deleted. + var entry: StoredCarbEntry? = nil + + static func == (lhs: CarbEvent, rhs: CarbEvent) -> Bool { + lhs.id == rhs.id && lhs.date == rhs.date && lhs.grams == rhs.grams + } +} + +struct TimedValue: Equatable { + let date: Date + let value: Double +} + +struct PumpLogEvent: Equatable, Identifiable { + enum Kind: Equatable { + case siteChange(String) + case alarm(String) + case resume + } + + let id: String + let date: Date + let kind: Kind +} + +/// Everything known about one day (or any window up to 48 hours), for InsulinTimeline and the Now screen. +struct DayHistory { + var window: DateInterval + var glucose: [GlucosePoint] = [] + var boluses: [BolusEvent] = [] + var basal: [BasalSegment] = [] + var scheduledBasal: [ScheduledBasalPoint] = [] + var carbs: [CarbEvent] = [] + var iob: [TimedValue] = [] + var cob: [TimedValue] = [] + /// Where the data came from, so older days can say they are missing Loop's own detail. + var source: HistorySource = .loop + + var bolusUnits: Double { boluses.reduce(0) { $0 + $1.units } } + var basalUnits: Double { basal.reduce(0) { $0 + $1.units } } + var carbGrams: Double { carbs.reduce(0) { $0 + $1.grams } } + var totalUnits: Double { bolusUnits + basalUnits } + var insulinSplit: InsulinSplit { InsulinSplit(basal: basalUnits, boluses: boluses) } + + /// Only what falls inside `interval`, with basal cut at its edges. + func clipped(to interval: DateInterval) -> DayHistory { + var history = self + let inside: (Date) -> Bool = { $0 >= interval.start && $0 < interval.end } + history.window = interval + history.glucose = glucose.filter { inside($0.date) } + history.boluses = boluses.filter { inside($0.date) } + history.basal = basal.compactMap { $0.clamped(to: interval) } + history.carbs = carbs.filter { inside($0.date) } + history.iob = iob.filter { inside($0.date) } + history.cob = cob.filter { inside($0.date) } + return history + } +} + +/// Basal and bolus for one day, or averaged per day, with bolus split into manual and automatic. +struct InsulinSplit: Equatable { + var basal = 0.0 + var manualBolus = 0.0 + var automaticBolus = 0.0 + /// Bolus that doesn't say whether it was manual or automatic; while there is any, the split isn't shown. + var unclassifiedBolus = 0.0 + + var bolus: Double { manualBolus + automaticBolus + unclassifiedBolus } + var total: Double { basal + bolus } + var isClassified: Bool { unclassifiedBolus < 0.005 } + + /// Shares in whole percent that add up to 100. + var bolusPercent: Int { total > 0 ? Int((bolus / total * 100).rounded()) : 0 } + var basalPercent: Int { total > 0 ? 100 - bolusPercent : 0 } +} + +extension InsulinSplit { + init(basal: Double, boluses: [BolusEvent]) { + self.basal = basal + for bolus in boluses { + if !bolus.automaticKnown { + unclassifiedBolus += bolus.units + } else if bolus.automatic { + automaticBolus += bolus.units + } else { + manualBolus += bolus.units + } + } + } + + /// The per-day average of several days' splits. + static func average(_ splits: [InsulinSplit]) -> InsulinSplit { + guard !splits.isEmpty else { return InsulinSplit() } + let n = Double(splits.count) + return InsulinSplit(basal: splits.reduce(0) { $0 + $1.basal } / n, + manualBolus: splits.reduce(0) { $0 + $1.manualBolus } / n, + automaticBolus: splits.reduce(0) { $0 + $1.automaticBolus } / n, + unclassifiedBolus: splits.reduce(0) { $0 + $1.unclassifiedBolus } / n) + } +} + +enum HistorySource { + /// Loop's own stores: manual versus automatic, temp basals and the schedule are all known. + case loop + /// Apple Health, for days older than Loop keeps. Doses are split into basal and bolus only. + case health +} + +/// One stretch of the period in a single loop mode. +struct LoopModeSpan: Equatable { + enum Mode: Equatable { + case closed + case limited + case open + } + + let start: Date + let end: Date + let mode: Mode + let cause: String? + + var duration: TimeInterval { end.timeIntervalSince(start) } +} + +// MARK: - Glucose unit + +struct GlucoseUnitStyle: Equatable { + let isMmol: Bool + + init(unit: LoopUnit) { + isMmol = unit == .millimolesPerLiter + } + + init(isMmol: Bool) { + self.isMmol = isMmol + } + + static let mgdlPerMmol = 18.0182 + + var unitName: String { isMmol ? "mmol/L" : "mg/dL" } + + func value(_ mgdl: Double) -> Double { isMmol ? mgdl / Self.mgdlPerMmol : mgdl } + func mgdl(_ displayValue: Double) -> Double { isMmol ? displayValue * Self.mgdlPerMmol : displayValue } + + func format(_ mgdl: Double) -> String { + isMmol ? LoopFormat.number(mgdl / Self.mgdlPerMmol, decimals: 1) : LoopFormat.number(mgdl, decimals: 0) + } + + /// Fixed chart scales from the design: 2–20 mmol/L on day views, 0–22 on AGP. + var dayDomain: ClosedRange { isMmol ? 2...20 : 36...360 } + var agpDomain: ClosedRange { isMmol ? 0...22 : 0...400 } + var dayTicks: [Double] { isMmol ? [4, 10, 16] : [70, 180, 300] } + var agpTicks: [Double] { isMmol ? [0, 4, 10, 16, 22] : [0, 70, 180, 250, 400] } +} + +// MARK: - Formatting + +enum LoopFormat { + /// A number in the user's locale, e.g. "7.3" or "7,3", with no grouping so values read like Loop's own screens. + static func number(_ value: Double, decimals: Int) -> String { + value.formatted(.number.precision(.fractionLength(decimals)).grouping(.never)) + } + + static func doseUnits(_ units: Double) -> String { + String(format: NSLocalizedString("%1$@ U", comment: "Format string for an amount of insulin in units. (1: amount)"), number(units, decimals: 2)) + } + + static func totalUnits(_ units: Double) -> String { + String(format: NSLocalizedString("%1$@ U", comment: "Format string for an amount of insulin in units. (1: amount)"), number(units, decimals: 1)) + } + + static func rate(_ rate: Double) -> String { + String(format: NSLocalizedString("%1$@ U/h", comment: "Format string for an insulin rate in units per hour. (1: rate)"), number(rate, decimals: 2)) + } + + static func grams(_ grams: Double) -> String { + String(format: NSLocalizedString("%1$@ g", comment: "Format string for an amount of carbohydrate in grams. (1: grams)"), number(grams, decimals: 0)) + } + + static func signed(_ value: Double, decimals: Int = 2) -> String { + let s = number(abs(value), decimals: decimals) + if abs(value) < pow(10, -Double(decimals)) / 2 { return "+" + s } + return (value < 0 ? "−" : "+") + s + } + + static func time(_ date: Date) -> String { + date.formatted(date: .omitted, time: .shortened) + } + + /// "25 Oct 2026" + static func day(_ date: Date) -> String { + date.formatted(.dateTime.day().month(.abbreviated).year()) + } + + /// "Sun 25 Oct" + static func weekdayDay(_ date: Date) -> String { + date.formatted(.dateTime.weekday(.abbreviated).day().month(.abbreviated)) + } + + /// "12 – 25 Oct 2026", "28 Sep – 25 Oct 2026", "20 Dec 2025 – 2 Jan 2026", in the user's locale. + static func range(_ start: Date, _ end: Date, calendar: Calendar = .current) -> String { + if calendar.isDate(start, inSameDayAs: end) { + return day(end) + } + let formatter = DateIntervalFormatter() + formatter.calendar = calendar + formatter.dateTemplate = "dMMMy" + return formatter.string(from: start, to: end) + } + + /// "13d 11h", "9h 45m", "40m" in English; abbreviated in the user's language. + static func duration(_ interval: TimeInterval) -> String { + let minutes = Int((interval / 60).rounded()) + let formatter = DateComponentsFormatter() + formatter.unitsStyle = .abbreviated + formatter.allowedUnits = minutes >= 1440 ? [.day, .hour] : minutes >= 60 ? [.hour, .minute] : [.minute] + formatter.zeroFormattingBehavior = .dropAll + return formatter.string(from: TimeInterval(minutes * 60)) ?? "" + } + + /// "2m", "1h 5m": how long ago, for the status pill. + static func ago(_ date: Date, now: Date = Date()) -> String { + let minutes = max(0, Int(now.timeIntervalSince(date) / 60)) + let formatter = DateComponentsFormatter() + formatter.unitsStyle = .abbreviated + formatter.allowedUnits = minutes >= 1440 ? [.day, .hour] : minutes >= 60 ? [.hour, .minute] : [.minute] + formatter.zeroFormattingBehavior = minutes == 0 ? .pad : .dropAll + return formatter.string(from: TimeInterval(minutes * 60)) ?? "" + } +} + +// MARK: - Store conversion boundaries + +extension BolusEvent { + init?(dose: DoseEntry, in interval: DateInterval) { + guard dose.type == .bolus, dose.startDate >= interval.start, dose.startDate < interval.end else { return nil } + self.init(id: dose.syncIdentifier ?? "\(dose.startDate.timeIntervalSince1970)", date: dose.startDate, + units: dose.unitsInDeliverableIncrements, automatic: dose.automatic ?? false, + manuallyEntered: dose.manuallyEntered, dose: dose) + } +} + +extension LoopHistoryMath.BasalDelivery { + init?(dose: DoseEntry) { + let kind: BasalSegment.Kind + switch dose.type { + case .basal: kind = .scheduled + case .tempBasal: kind = .temp + case .suspend: kind = .suspended + default: return nil + } + let hours = dose.endDate.timeIntervalSince(dose.startDate) / 3600 + guard hours > 0 else { return nil } + self.init(start: dose.startDate, end: dose.endDate, + rate: kind == .suspended ? 0 : dose.unitsInDeliverableIncrements / hours, + kind: kind, automatic: dose.automatic ?? (kind == .temp)) + } +} + +extension BasalSegment { + init?(healthSample sample: HKQuantitySample, in interval: DateInterval) { + let hours = sample.endDate.timeIntervalSince(sample.startDate) / 3600 + guard hours > 0 else { return nil } + let scheduled = (sample.metadata?["com.loopkit.InsulinKit.MetadataKeyScheduledBasalRate"] as? HKQuantity)? + .doubleValue(for: HKUnit.internationalUnit().unitDivided(by: .hour())) + let segment = BasalSegment(start: sample.startDate, end: sample.endDate, + rate: sample.quantity.doubleValue(for: .internationalUnit()) / hours, + scheduledRate: scheduled, kind: .temp, + automatic: (sample.metadata?["com.loopkit.InsulinKit.MetadataKeyAutomaticallyIssued"] as? NSNumber)?.boolValue ?? false) + guard let clamped = segment.clamped(to: interval) else { return nil } + self = clamped + } +} diff --git a/Loop/Redesign/LoopHistoryProvider.swift b/Loop/Redesign/LoopHistoryProvider.swift new file mode 100644 index 0000000000..887c3ffb4e --- /dev/null +++ b/Loop/Redesign/LoopHistoryProvider.swift @@ -0,0 +1,535 @@ +// +// LoopHistoryProvider.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import Foundation +import HealthKit +import LoopKit +import LoopCore +import LoopAlgorithm +import os + +/// Reads glucose, insulin, carbs and loop runs for the redesigned screens. +/// +/// Loop keeps `LOOP_LOCAL_CACHE_DURATION_DAYS` (7) days in its own stores. Inside that window everything comes from +/// those stores, so manual and automatic doses, temp basals and the schedule are known. Older days come from Apple +/// Health, which has glucose, carbs and insulin split only into basal and bolus. +final class LoopHistoryProvider { + + private let deviceManager: DeviceDataManager + private let loopDataManager: LoopDataManager + private let settingsManager: SettingsManager + private let temporaryPresetsManager: TemporaryPresetsManager + private let dosingDecisionStore: DosingDecisionStoreProtocol + private let doseStore: DoseStore + private let carbStore: CarbStore + private let glucoseStore: GlucoseStore + private let healthStore = HKHealthStore() + private let log = OSLog(category: "LoopHistoryProvider") + private let recordsStartCache = OSAllocatedUnfairLock<(fetched: Date, value: Date?)?>(initialState: nil) + + @MainActor + init(deviceManager: DeviceDataManager, loopDataManager: LoopDataManager, settingsManager: SettingsManager, temporaryPresetsManager: TemporaryPresetsManager) { + self.deviceManager = deviceManager + self.loopDataManager = loopDataManager + self.settingsManager = settingsManager + self.temporaryPresetsManager = temporaryPresetsManager + self.dosingDecisionStore = loopDataManager.dosingDecisionStore + self.doseStore = deviceManager.doseStore + self.carbStore = deviceManager.carbStore + self.glucoseStore = deviceManager.glucoseStore + } + + @MainActor + var unitStyle: GlucoseUnitStyle { + GlucoseUnitStyle(unit: deviceManager.displayGlucosePreference.unit) + } + + /// Match the classic carb editor's eligibility rule, including mode changes while a screen is open. + @MainActor + var allowsCarbEditing: Bool { + settingsManager.dosingEnabled || !FeatureFlags.simpleBolusCalculatorEnabled + } + + /// The start of what Loop keeps locally. + var localHistoryStart: Date { + Date().addingTimeInterval(-Bundle.main.localCacheDuration) + } + + @MainActor + var glucoseTargetRange: ClosedRange? { + guard let range = temporaryPresetsManager.effectiveCorrectionRange() else { return nil } + return range.lowerBound.doubleValue(for: .milligramsPerDeciliter)...range.upperBound.doubleValue(for: .milligramsPerDeciliter) + } + + /// What the basal schedule delivers in a day, for days the stored profile history doesn't reach. + @MainActor + var scheduledBasalPerDay: Double? { + loopDataManager.settingsProvider.settings.basalRateSchedule?.total() + } + + /// The median insulin delivered from midnight to this time of day over the last 14 days, as on Statistics. + func typicalInsulinByNow() async -> (typical: TypicalInsulinDelivery, at: Date)? { + guard let history = try? await loopDataManager.insulinDeliveryHistory(days: 14), + let typical = history.typicalDelivery(by: history.end) else { return nil } + return (typical, history.end) + } + + /// The targets that actually applied, including dated presets and changes to the stored profile. + func glucoseTargetBands(in interval: DateInterval) async throws -> [TargetBand] { + if let store = settingsManager.settingsStore { + let previous = try await store.getStoredSettings(end: interval.start, limit: 1).first + if previous?.glucoseTargetRangeSchedule == nil { + let changes = try await store.getStoredSettings(start: interval.start, end: interval.end) + // LoopKit's historical query requires at least one valid profile, even if settings records exist. + guard changes.contains(where: { $0.glucoseTargetRangeSchedule != nil }) else { return [] } + } + } + return try await loopDataManager.glucoseTargetBands(in: interval) + } + + // MARK: - Days + + /// Everything in `window`; IOB and COB only when asked, as they are the slowest part. + func dayHistory(_ window: DateInterval, includeOnBoard: Bool = true) async throws -> DayHistory { + var history = DayHistory(window: window) + let boundary = localHistoryStart + + if window.end > boundary { + let local = DateInterval(start: max(window.start, boundary), end: window.end) + async let glucose = localGlucose(local) + async let insulin = localInsulin(local) + async let carbs = localCarbs(local) + history.glucose = try await glucose + (history.boluses, history.basal, history.scheduledBasal) = try await insulin + history.carbs = try await carbs + if includeOnBoard { + async let iob = localIOB(local) + async let cob = localCOB(local) + history.iob = try await iob + history.cob = try await cob + } + } + + if window.start < boundary { + let older = DateInterval(start: window.start, end: min(window.end, boundary)) + async let glucose = healthGlucose(older) + async let insulin = healthInsulin(older) + async let carbs = healthCarbs(older) + let (boluses, basal) = try await insulin + history.glucose = try await glucose + history.glucose + history.boluses = boluses + history.boluses + history.basal = basal + history.basal + history.carbs = try await carbs + history.carbs + if window.end <= boundary { + history.source = .health + } + } + try Task.checkCancellation() + return history + } + + /// CGM readings for any period, local and Health combined. + func glucose(_ interval: DateInterval) async throws -> [GlucosePoint] { + let boundary = localHistoryStart + var points: [GlucosePoint] = [] + if interval.start < boundary { + points += try await healthGlucose(DateInterval(start: interval.start, end: min(interval.end, boundary))) + } + if interval.end > boundary { + points += try await localGlucose(DateInterval(start: max(interval.start, boundary), end: interval.end)) + } + return points + } + + // MARK: - Loop runs + + /// Loop runs in the local window, oldest first, with when the record of them begins. + func loopRuns() async throws -> (runs: [LoopHistoryMath.LoopRun], coverageStart: Date?) { + let start = localHistoryStart + var runs: [LoopHistoryMath.LoopRun] + if let store = dosingDecisionStore as? DosingDecisionStore { + // Decode only the fields a run needs, and only Loop's local window. + runs = try await store.getDosingDecisions(start: start, end: Date(), as: LoopRunRecord.self) + .filter { $0.reason == "loop" } + .map { record in + LoopHistoryMath.LoopRun(date: record.date, succeeded: (record.errors ?? []).isEmpty, + error: record.errors?.first.map { Self.describe(issue: $0.id) }) + } + } else { + runs = try await anchoredLoopRuns() + } + try Task.checkCancellation() + runs = runs.filter { $0.date >= start }.sorted { $0.date < $1.date } + return (runs, runs.first?.date) + } + + private struct LoopRunRecord: Decodable { + struct Issue: Decodable { let id: String } + let date: Date + let reason: String + let errors: [Issue]? + } + + /// Fetch each snapshot independently: overlapping reloads must not append the same anchored page twice. + private func anchoredLoopRuns() async throws -> [LoopHistoryMath.LoopRun] { + var anchor: DosingDecisionStore.QueryAnchor? + var runs: [LoopHistoryMath.LoopRun] = [] + while true { + let page: (DosingDecisionStore.QueryAnchor, [StoredDosingDecision]) = try await withCheckedThrowingContinuation { continuation in + dosingDecisionStore.executeDosingDecisionQuery(fromQueryAnchor: anchor, limit: 1000) { result in + switch result { + case .success(let anchor, let decisions): continuation.resume(returning: (anchor, decisions)) + case .failure(let error): continuation.resume(throwing: error) + } + } + } + try Task.checkCancellation() + anchor = page.0 + runs += page.1.filter { $0.reason == "loop" }.map { decision in + LoopHistoryMath.LoopRun(date: decision.date, succeeded: decision.errors.isEmpty, + error: decision.errors.first.map { Self.describe(issue: $0.id) }) + } + if page.1.count < 1000 { break } + } + return runs + } + + /// "glucoseTooOld" → "Glucose too old". Loop's own issue ids are localised; any other id falls back to the + /// id split into English words. + static func describe(issue id: String) -> String { + switch id { + case "configurationError": return NSLocalizedString("Configuration error", comment: "Reason Loop could not run: its settings are incomplete") + case "connectionError": return NSLocalizedString("Connection error", comment: "Reason Loop could not run: no connected devices, or a device connection failed") + case "missingDataError": return NSLocalizedString("Missing data error", comment: "Reason Loop could not run: data it needs was missing") + case "glucoseTooOld": return NSLocalizedString("Glucose too old", comment: "Reason Loop could not run: the latest glucose reading was too old") + case "invalidFutureGlucose": return NSLocalizedString("Invalid future glucose", comment: "Reason Loop could not run: a glucose reading had a timestamp in the future") + case "pumpDataTooOld": return NSLocalizedString("Pump data too old", comment: "Reason Loop could not run: the latest pump data was too old") + case "recommendationExpired": return NSLocalizedString("Recommendation expired", comment: "Reason Loop could not run: its dosing recommendation expired before it was used") + case "pumpSuspended": return NSLocalizedString("Pump suspended", comment: "Reason Loop could not run: insulin delivery on the pump was suspended") + case "pumpManagerError": return NSLocalizedString("Pump manager error", comment: "Reason Loop could not run: the pump reported an error") + case "unknownError": return NSLocalizedString("Unknown error", comment: "Reason Loop could not run: an unexpected error") + default: break + } + var words: [String] = [] + var current = "" + for character in id { + if character.isUppercase, !current.isEmpty { + words.append(current) + current = "" + } + current.append(character) + } + words.append(current) + let sentence = words.joined(separator: " ").lowercased() + return sentence.prefix(1).uppercased() + sentence.dropFirst() + } + + // MARK: - Pump events + + func pumpEvents(since start: Date) async throws -> [PumpLogEvent] { + let events = try await doseStore.getPumpEventValues(since: start) + let items: [PumpLogEvent] = events.compactMap { event in + let id = event.objectIDURL.absoluteString + switch event.type { + case .replaceComponent(let component)?: + let name: String + switch component { + case .pump: name = NSLocalizedString("Pod changed", comment: "Pump event in the history: the pump or pod was replaced") + case .reservoir: name = NSLocalizedString("Reservoir changed", comment: "Pump event in the history: the insulin reservoir was replaced") + case .infusionSet: name = NSLocalizedString("Infusion set changed", comment: "Pump event in the history: the infusion set was replaced") + } + return PumpLogEvent(id: id, date: event.date, kind: .siteChange(name)) + case .rewind?: + return PumpLogEvent(id: id, date: event.date, kind: .siteChange(NSLocalizedString("Reservoir rewound", comment: "Pump event in the history: the pump rewound its reservoir"))) + case .prime?: + return PumpLogEvent(id: id, date: event.date, kind: .siteChange(NSLocalizedString("Primed", comment: "Pump event in the history: the pump primed the tubing or cannula"))) + case .alarm?: + // `title` is a debug description; only a pump's own alarm text is meant for people. + let pumpText: String? + if case .other(let details)? = event.alarmType, !details.isEmpty { pumpText = details } else { pumpText = nil } + return PumpLogEvent(id: id, date: event.date, kind: .alarm(pumpText ?? NSLocalizedString("Pump alarm", comment: "Pump event in the history: an alarm whose pump gave no title"))) + default: + return nil + } + } + return items + } + + // MARK: - Editing + + /// Edits an entry the way Loop's carb absorption screen does. + @MainActor + func carbEntryViewModel(editing entry: StoredCarbEntry) -> CarbEntryViewModel { + let viewModel = CarbEntryViewModel(delegate: loopDataManager, originalCarbEntry: entry) + viewModel.analyticsServicesManager = loopDataManager.analyticsServicesManager + viewModel.deliveryDelegate = deviceManager + return viewModel + } + + func delete(carb entry: StoredCarbEntry) async throws { + _ = try await loopDataManager.deleteCarbEntry(entry) + } + + func delete(dose: DoseEntry) async throws { + try await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in + doseStore.deleteDose(dose) { error in + if let error { + continuation.resume(throwing: error) + } else { + continuation.resume() + } + } + } + } + + // MARK: - Loop's stores + + private func localGlucose(_ interval: DateInterval) async throws -> [GlucosePoint] { + do { + let samples = try await glucoseStore.getGlucoseSamples(start: interval.start, end: interval.end) + return samples + .filter { !$0.isDisplayOnly } + .map { GlucosePoint(date: $0.startDate, mgdl: $0.quantity.doubleValue(for: .milligramsPerDeciliter), userEntered: $0.wasUserEntered) } + } catch { + os_log("Glucose fetch failed: %{public}@", log: log, type: .error, String(describing: error)) + throw error + } + } + + /// Doses for `interval`, with the start of Loop's insulin records (its earliest local dose). The start is kept + /// for a few minutes so day pages and periods don't each read the whole local history; when it isn't known, + /// one read from the start of the local history serves both. + private func doses(for interval: DateInterval) async throws -> (doses: [DoseEntry], recordsStart: Date?) { + let localStart = localHistoryStart + if interval.start <= localStart { + let doses = try await doseStore.getNormalizedDoseEntries(start: interval.start, end: interval.end) + return (doses, doses.map(\.startDate).min()) + } + if let cached = recordsStartCache.withLock({ $0 }), Date().timeIntervalSince(cached.fetched) < 300 { + return (try await doseStore.getNormalizedDoseEntries(start: interval.start, end: interval.end), cached.value) + } + let local = try await doseStore.getNormalizedDoseEntries(start: localStart, end: interval.end) + let recordsStart = local.map(\.startDate).min() + recordsStartCache.withLock { $0 = (fetched: Date(), value: recordsStart) } + return (local.filter { + $0.startDate < interval.end && ($0.type == .bolus ? $0.startDate >= interval.start : $0.endDate > interval.start) + }, recordsStart) + } + + private func localInsulin(_ interval: DateInterval) async throws -> ([BolusEvent], [BasalSegment], [ScheduledBasalPoint]) { + let doses: [DoseEntry] + let recordsStart: Date? + do { + (doses, recordsStart) = try await self.doses(for: interval) + } catch { + os_log("Dose fetch failed: %{public}@", log: log, type: .error, String(describing: error)) + throw error + } + + let boluses = doses.compactMap { BolusEvent(dose: $0, in: interval) } + + let basalHistory = try await loopDataManager.settingsProvider.getBasalHistory(startDate: interval.start, endDate: interval.end) + let temporaryPresetsManager = self.temporaryPresetsManager + let overrides = await MainActor.run { + temporaryPresetsManager.presetHistory.getOverrideHistory(startDate: interval.start, endDate: interval.end) + } + // A resolved daily schedule repeats recent presets on every day. Use the stored profile and dated overrides. + let scheduleValues = overrides.applyBasal(over: basalHistory) + let schedule = scheduleValues.map { LoopHistoryMath.ScheduleValue(start: $0.startDate, end: $0.endDate, rate: $0.value) } + let deliveries = doses.compactMap { LoopHistoryMath.BasalDelivery(dose: $0) } + let now = Date() + let window = DateInterval(start: interval.start, end: max(interval.start, min(interval.end, now))) + // As in Loop's insulin totals: after the first record, unrecorded time runs at the pump's programmed rate. + let programmed = basalHistory.map { LoopHistoryMath.ScheduleValue(start: $0.startDate, end: $0.endDate, rate: $0.value) } + let basal = window.duration > 0 + ? LoopHistoryMath.basalSegments(window: window, schedule: schedule, deliveries: deliveries, + programmedRates: programmed, recordsStart: recordsStart) + : [] + let scheduled = schedule.map { ScheduledBasalPoint(start: max($0.start, interval.start), end: min($0.end, interval.end), rate: $0.rate) } + return (boluses, basal, scheduled) + } + + private func localCarbs(_ interval: DateInterval) async throws -> [CarbEvent] { + do { + let entries = try await carbStore.getCarbEntries(start: interval.start, end: interval.end) + return entries.map { entry in + CarbEvent(id: entry.syncIdentifier ?? "\(entry.startDate.timeIntervalSince1970)", + date: entry.startDate, + grams: entry.quantity.doubleValue(for: .gram), + absorptionHours: entry.absorptionTime.map { $0 / 3600 }, + foodType: entry.foodType, + createdByLoop: entry.createdByCurrentApp, + entry: entry) + } + } catch { + os_log("Carb fetch failed: %{public}@", log: log, type: .error, String(describing: error)) + throw error + } + } + + private func localIOB(_ interval: DateInterval) async throws -> [TimedValue] { + try await loopDataManager.insulinOnBoardTimeline(in: interval).map { TimedValue(date: $0.startDate, value: $0.value) } + } + + private func localCOB(_ interval: DateInterval) async throws -> [TimedValue] { + try await loopDataManager.carbsOnBoardTimeline(in: interval).map { TimedValue(date: $0.startDate, value: $0.quantity.doubleValue(for: .gram)) } + } + + // MARK: - Apple Health + + private func healthSamples(_ type: HKQuantityType, _ interval: DateInterval, options: HKQueryOptions = .strictStartDate) async throws -> [HKQuantitySample] { + guard interval.duration > 0 else { return [] } + let log = self.log + return try await withCheckedThrowingContinuation { continuation in + let predicate = HKQuery.predicateForSamples(withStart: interval.start, end: interval.end, options: options) + let sort = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: true) + let query = HKSampleQuery(sampleType: type, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: [sort]) { _, samples, error in + if let error { + os_log("Health query for %{public}@ failed: %{public}@", log: log, type: .error, type.identifier, String(describing: error)) + continuation.resume(throwing: error) + } else { + continuation.resume(returning: (samples as? [HKQuantitySample]) ?? []) + } + } + healthStore.execute(query) + } + } + + /// Several apps can write the same CGM reading to Health; keep one reading per 2½ minutes. + private func healthGlucose(_ interval: DateInterval) async throws -> [GlucosePoint] { + let samples = try await healthSamples(HKQuantityType(.bloodGlucose), interval) + var points: [GlucosePoint] = [] + let own = HKSource.default().bundleIdentifier + for sample in samples where !sample.isDisplayOnly + && (FeatureFlags.observeHealthKitGlucoseSamplesFromOtherApps || sample.sourceRevision.source.bundleIdentifier == own) { + if let last = points.last, sample.startDate.timeIntervalSince(last.date) < 150 { continue } + points.append(GlucosePoint(date: sample.startDate, mgdl: sample.quantity.doubleValue(for: .milligramsPerDeciliter), + userEntered: sample.wasUserEntered)) + } + return points + } + + private func healthInsulin(_ interval: DateInterval) async throws -> ([BolusEvent], [BasalSegment]) { + let samples = try await healthSamples(HKQuantityType(.insulinDelivery), interval, options: []) + var boluses: [BolusEvent] = [] + var basal: [BasalSegment] = [] + let own = HKSource.default().bundleIdentifier + for sample in samples where FeatureFlags.observeHealthKitDoseSamplesFromOtherApps || sample.sourceRevision.source.bundleIdentifier == own { + let units = sample.quantity.doubleValue(for: .internationalUnit()) + let reason = (sample.metadata?[HKMetadataKeyInsulinDeliveryReason] as? NSNumber)?.intValue + let automaticFlag = (sample.metadata?["com.loopkit.InsulinKit.MetadataKeyAutomaticallyIssued"] as? NSNumber)?.boolValue + let automatic = automaticFlag ?? false + if reason == HKInsulinDeliveryReason.basal.rawValue { + if let segment = BasalSegment(healthSample: sample, in: interval) { + basal.append(segment) + } + } else if sample.startDate >= interval.start && sample.startDate < interval.end { + boluses.append(BolusEvent(id: sample.uuid.uuidString, date: sample.startDate, units: units, automatic: automatic, manuallyEntered: false, + automaticKnown: automaticFlag != nil)) + } + } + return (boluses, basal) + } + + private func healthCarbs(_ interval: DateInterval) async throws -> [CarbEvent] { + let samples = try await healthSamples(HKQuantityType(.dietaryCarbohydrates), interval) + let own = HKSource.default().bundleIdentifier + return samples + .filter { FeatureFlags.observeHealthKitCarbSamplesFromOtherApps || $0.sourceRevision.source.bundleIdentifier == own } + .map { sample in + CarbEvent(id: sample.uuid.uuidString, date: sample.startDate, grams: sample.quantity.doubleValue(for: .gram()), + absorptionHours: nil, foodType: sample.metadata?[HKMetadataKeyFoodType] as? String, + createdByLoop: sample.sourceRevision.source.bundleIdentifier == own) + } + } +} + +// MARK: - Loop mode history + +/// Records when closed loop is switched on and off, because Loop's stored runs don't say which mode they ran in. +/// The Trends screen can only call time "open loop" from the first record on. +final class LoopModeHistory { + static let shared = LoopModeHistory() + + private let defaults: UserDefaults + private let key = "com.loopkit.Loop.redesign.loopModeChanges" + private let maximumAge: TimeInterval = .days(100) + + init(defaults: UserDefaults = .standard) { + self.defaults = defaults + } + + var changes: [LoopHistoryMath.ModeChange] { + guard let data = defaults.data(forKey: key), + let changes = try? JSONDecoder().decode([LoopHistoryMath.ModeChange].self, from: data) else { + return [] + } + return changes + } + + func record(closedLoop: Bool, at date: Date = Date()) { + var changes = self.changes + guard changes.last?.closedLoop != closedLoop else { return } + changes.append(.init(date: date, closedLoop: closedLoop)) + // Keep the last change before the retention window: it establishes the mode at its start. + let cutoff = date.addingTimeInterval(-maximumAge) + if let anchor = changes.lastIndex(where: { $0.date < cutoff }), anchor > 0 { + changes.removeFirst(anchor) + } + if let data = try? JSONEncoder().encode(changes) { + defaults.set(data, forKey: key) + } + } +} + +// MARK: - Loop's on-board history + +extension LoopDataManager { + /// A historical chart must use the profile and presets from that time, rather than repeat today's targets. + func glucoseTargetBands(in interval: DateInterval) async throws -> [TargetBand] { + guard settingsProvider.settings.glucoseTargetRangeSchedule != nil else { return [] } + let schedule = try await settingsProvider.getTargetRangeHistory(startDate: interval.start, endDate: interval.end) + var bands = schedule.map { + TargetBand(start: max($0.startDate, interval.start), end: min($0.endDate, interval.end), + range: $0.value.lowerBound.doubleValue(for: .milligramsPerDeciliter)...$0.value.upperBound.doubleValue(for: .milligramsPerDeciliter)) + } + let overrides = temporaryPresetsManager.presetHistory.getOverrideHistory(startDate: interval.start, endDate: interval.end) + for override in overrides.sorted(by: { $0.startDate < $1.startDate }) { + guard let target = override.settings.targetRange, + let active = override.activeInterval.intersection(with: interval), active.duration > 0 else { continue } + bands = bands.flatMap { band -> [TargetBand] in + var pieces: [TargetBand] = [] + if band.start < active.start { + pieces.append(TargetBand(start: band.start, end: min(band.end, active.start), range: band.range)) + } + if band.end > active.end { + pieces.append(TargetBand(start: max(band.start, active.end), end: band.end, range: band.range)) + } + return pieces + } + [TargetBand(start: active.start, end: active.end, + range: target.lowerBound.doubleValue(for: .milligramsPerDeciliter)...target.upperBound.doubleValue(for: .milligramsPerDeciliter))] + } + return bands.filter { $0.end > $0.start }.sorted { $0.start < $1.start } + } + + /// Insulin on board across `interval`, from the doses and basal history Loop keeps, as `iobValues` is for the display window. + func insulinOnBoardTimeline(in interval: DateInterval) async throws -> [InsulinValue] { + let dosesStart = interval.start.addingTimeInterval(-InsulinMath.defaultInsulinActivityDuration) + let doses = try await doseStore.getNormalizedDoseEntries(start: dosesStart, end: interval.end) + .map { $0.simpleDose(with: insulinModel(for: $0.insulinType)) } + let basalStart = min(dosesStart, doses.map(\.startDate).min() ?? dosesStart) + let basal = try await settingsProvider.getBasalHistory(startDate: basalStart, endDate: interval.end) + let overrides = temporaryPresetsManager.presetHistory.getOverrideHistory(startDate: basalStart, endDate: interval.end) + return doses.annotated(with: overrides.applyBasal(over: basal)).insulinOnBoardTimeline(from: interval.start, to: interval.end) + } + + /// Carbs on board across `interval`, using the same absorption review as Loop's carb screen. + func carbsOnBoardTimeline(in interval: DateInterval) async throws -> [CarbValue] { + let review = try await fetchCarbAbsorptionReview(start: interval.start.addingTimeInterval(-CarbMath.maximumAbsorptionTimeInterval), end: interval.end) + return review.carbStatuses.dynamicCarbsOnBoard(from: interval.start, to: interval.end, absorptionModel: carbAbsorptionModel.model) + } +} diff --git a/Loop/Redesign/MainTabBarController.swift b/Loop/Redesign/MainTabBarController.swift new file mode 100644 index 0000000000..3765b8d2a7 --- /dev/null +++ b/Loop/Redesign/MainTabBarController.swift @@ -0,0 +1,94 @@ +// +// MainTabBarController.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import UIKit +import SwiftUI +import WidgetKit +import LoopCore + +/// Whether Loop shows the redesigned interface (tabs: Now, Trends, Logbook, Settings) or the classic status screen. +enum LoopInterfacePreference { + private static let key = "com.loopkit.Loop.redesign.enabled" + + static let didChange = Notification.Name("LoopInterfacePreferenceDidChange") + + static var useRedesign: Bool { + get { UserDefaults.standard.object(forKey: key) as? Bool ?? true } + set { + guard newValue != useRedesign else { return } + UserDefaults.standard.set(newValue, forKey: key) + syncToExtensions() + NotificationCenter.default.post(name: didChange, object: nil) + } + } + + /// Copies the setting to the app group, where the widget and Live Activity read it, and redraws both. + static func syncToExtensions() { + guard let shared = UserDefaults.appGroup, shared.redesignEnabled != useRedesign else { return } + shared.redesignEnabled = useRedesign + WidgetCenter.shared.reloadAllTimelines() + // The Live Activity otherwise keeps its old look until Loop next runs. + NotificationCenter.default.post(name: .LiveActivitySettingsChanged, object: nil) + } +} + +/// The redesign's root. The Now tab is Loop's own RootNavigationController, so every existing flow +/// (bolus, carbs, presets, alerts, device settings, deeplinks) keeps working from StatusTableViewController. +final class MainTabBarController: UITabBarController, UITabBarControllerDelegate { + + let rootNavigationController: RootNavigationController + private weak var statusTableViewController: StatusTableViewController? + private let provider: LoopHistoryProvider + private let settingsPlaceholder = UIViewController() + + init(rootNavigationController: RootNavigationController, statusTableViewController: StatusTableViewController, deviceManager: DeviceDataManager, loopDataManager: LoopDataManager, settingsManager: SettingsManager) { + self.rootNavigationController = rootNavigationController + self.statusTableViewController = statusTableViewController + self.provider = LoopHistoryProvider(deviceManager: deviceManager, loopDataManager: loopDataManager, settingsManager: settingsManager, temporaryPresetsManager: statusTableViewController.temporaryPresetsManager) + super.init(nibName: nil, bundle: nil) + + rootNavigationController.tabBarItem = UITabBarItem(title: NSLocalizedString("Now", comment: "Title of the Now tab in the redesigned interface, showing current glucose and Loop status"), image: UIImage(systemName: "drop.fill"), tag: 0) + + let trends = UIHostingController(rootView: TrendsView(provider: provider)) + trends.tabBarItem = UITabBarItem(title: NSLocalizedString("Trends", comment: "Title of the Trends tab in the redesigned interface"), image: UIImage(systemName: "chart.bar.fill"), tag: 1) + + let logbook = UIHostingController(rootView: LogbookView(provider: provider, deviceManager: deviceManager)) + logbook.tabBarItem = UITabBarItem(title: NSLocalizedString("Logbook", comment: "Title of the Logbook tab in the redesigned interface, listing past events"), image: UIImage(systemName: "list.bullet"), tag: 2) + + settingsPlaceholder.tabBarItem = UITabBarItem(title: NSLocalizedString("Settings", comment: "Title of the Settings tab in the redesigned interface"), image: UIImage(systemName: "gearshape.fill"), tag: 3) + + viewControllers = [rootNavigationController, trends, logbook, settingsPlaceholder] + delegate = self + tabBar.tintColor = UIColor(named: "accent") + if #available(iOS 18.0, *) { + mode = .tabBar + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + /// Settings stays a sheet, as in classic Loop, so the tab only presents it. It is presented from the Now tab: + /// device and service screens open from Settings through StatusTableViewController, which is only in the window + /// while Now is selected. + func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { + guard viewController === settingsPlaceholder else { return true } + showNow() + statusTableViewController?.presentSettingsFromTab() + return false + } + + func showNow() { + selectedViewController = rootNavigationController + } + + override func restoreUserActivityState(_ activity: NSUserActivity) { + showNow() + rootNavigationController.restoreUserActivityState(activity) + } +} diff --git a/Loop/Redesign/NowScreen.swift b/Loop/Redesign/NowScreen.swift new file mode 100644 index 0000000000..1a0e357af6 --- /dev/null +++ b/Loop/Redesign/NowScreen.swift @@ -0,0 +1,844 @@ +// +// NowScreen.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import HealthKit +import LoopKit +import LoopKitUI +import LoopCore +import LoopAlgorithm + +private typealias P = LoopDesign.Palette + +/// What the Now screen shows. StatusTableViewController owns it and asks it to refresh whenever Loop's data changes. +@MainActor +final class NowModel: ObservableObject { + + struct Reading: Equatable { + let mgdl: Double + let date: Date + let trend: GlucoseTrend? + /// Change since the previous reading, per 5 minutes. + let delta: Double? + } + + struct Device: Equatable { + let name: String + let message: String? + let state: DeviceStatusHighlightState? + /// Set when the message is the device's own status highlight, which the Now screen spells out in a notice. + var symbol: String? = nil + /// The device's lifecycle (pod, sensor) is near its end; the pill says so. + var endingSoon = false + } + + enum LoopState: Equatable { + case fresh + case stale + case failed + case never + } + + @Published private(set) var reading: Reading? + @Published private(set) var lastLoopCompleted: Date? + @Published private(set) var lastLoopFailed = false + @Published private(set) var closedLoop = false + /// Closed loop is switched on but Loop has paused it, for example while the CGM has no session or data. + @Published private(set) var closedLoopPaused = false + @Published private(set) var iob: Double? + @Published private(set) var cob: Double? + @Published private(set) var basalDeliveryState: PumpManagerStatus.BasalDeliveryState? + @Published private(set) var programmedBasalRate: Double? + @Published private(set) var scheduledBasalRate: Double? + @Published private(set) var suspended = false + @Published private(set) var targetRange: ClosedRange? + @Published private(set) var predictionTargets: [TargetBand] = [] + @Published private(set) var todayTargets: [TargetBand] = [] + @Published private(set) var prediction: [GlucosePoint] = [] + @Published private(set) var recentGlucose: [GlucosePoint] = [] + @Published private(set) var historyError: String? + @Published private(set) var glucoseHistoryError: String? + @Published private(set) var today: DayHistory + @Published private(set) var pump: Device? + @Published private(set) var cgm: Device? + @Published private(set) var dosingAvailable = true + @Published private(set) var preMealOn = false + @Published private(set) var overrideName: String? + @Published private(set) var unit: GlucoseUnitStyle + @Published var now = Date() + /// Set by StatusTableViewController, which owns the onboarding state. + var isOnboardingComplete: () -> Bool = { true } + + let provider: LoopHistoryProvider + private let deviceManager: DeviceDataManager + private let loopDataManager: LoopDataManager + private let settingsManager: SettingsManager + private let temporaryPresetsManager: TemporaryPresetsManager + private var refreshTask: Task? + private var pendingRefresh = false + + init(deviceManager: DeviceDataManager, loopDataManager: LoopDataManager, settingsManager: SettingsManager, temporaryPresetsManager: TemporaryPresetsManager) { + self.deviceManager = deviceManager + self.loopDataManager = loopDataManager + self.settingsManager = settingsManager + self.temporaryPresetsManager = temporaryPresetsManager + self.provider = LoopHistoryProvider(deviceManager: deviceManager, loopDataManager: loopDataManager, settingsManager: settingsManager, temporaryPresetsManager: temporaryPresetsManager) + self.unit = provider.unitStyle + let start = Calendar.current.startOfDay(for: Date()) + self.today = DayHistory(window: DateInterval(start: start, duration: 86400)) + } + + var basalRate: Double? { + switch basalDeliveryState { + case .tempBasal(let dose)?: + return dose.startDate <= now && now < dose.endDate ? dose.unitsPerHour : programmedBasalRate + case .active?: return programmedBasalRate + case .suspended?, .suspending?: return 0 + default: return nil + } + } + + var loopState: LoopState { + guard let lastLoopCompleted else { return .never } + let age = now.timeIntervalSince(lastLoopCompleted) + if age <= 5 * 60 + 30 { return .fresh } + if age <= 15 * 60 { return .stale } + return .failed + } + + var readingIsStale: Bool { + guard let reading else { return true } + return now.timeIntervalSince(reading.date) > LoopAlgorithm.inputDataRecencyInterval + } + + /// Refreshes everything; calls made while a refresh runs are coalesced into one more. + func refresh() { + guard refreshTask == nil else { + pendingRefresh = true + return + } + refreshTask = Task { [weak self] in + await self?.load() + guard let self else { return } + self.refreshTask = nil + if self.pendingRefresh { + self.pendingRefresh = false + self.refresh() + } + } + } + + private func load() async { + let now = Date() + self.now = now + unit = provider.unitStyle + + let displayState = await loopDataManager.algorithmDisplayState + let predicted = (displayState.output?.predictedGlucose ?? []).map { + GlucosePoint(date: $0.startDate, mgdl: $0.quantity.doubleValue(for: .milligramsPerDeciliter)) + } + var failed = false + if let output = displayState.output, case .failure = output.recommendationResult { + failed = true + } + + let start = Calendar.current.startOfDay(for: now) + let window = DateInterval(start: start, end: Calendar.current.date(byAdding: .day, value: 1, to: start)!) + async let dayFetch = provider.dayHistory(window) + async let recentFetch = provider.glucose(DateInterval(start: now.addingTimeInterval(-3 * 3600), end: now)) + do { + let targets = try await provider.glucoseTargetBands(in: window) + today = try await dayFetch + todayTargets = targets + historyError = nil + } catch { + historyError = error.localizedDescription + } + do { + let predictionWindow = DateInterval(start: now.addingTimeInterval(-3 * 3600), end: now.addingTimeInterval(3 * 3600)) + predictionTargets = try await provider.glucoseTargetBands(in: predictionWindow) + recentGlucose = try await recentFetch + glucoseHistoryError = nil + } catch { + recentGlucose = [] + glucoseHistoryError = error.localizedDescription + } + + prediction = predicted + iob = loopDataManager.activeInsulin?.value + cob = loopDataManager.activeCarbs?.quantity.doubleValue(for: .gram) + lastLoopFailed = failed + lastLoopCompleted = loopDataManager.lastLoopCompleted + // Closed loop is on but paused while the CGM session or a manual temp basal rules out automation. + closedLoopPaused = settingsManager.dosingEnabled && deviceManager.closedLoopDisallowedLocalizedDescription != nil + closedLoop = settingsManager.dosingEnabled && !closedLoopPaused + targetRange = provider.glucoseTargetRange + + if let latest = loopDataManager.latestGlucose { + let mgdl = latest.quantity.doubleValue(for: .milligramsPerDeciliter) + let previous = recentGlucose.last { $0.date < latest.startDate.addingTimeInterval(-60) } + var delta: Double? = nil + if let previous, latest.startDate.timeIntervalSince(previous.date) <= 15 * 60 { + delta = (mgdl - previous.mgdl) / latest.startDate.timeIntervalSince(previous.date) * 300 + } + // The CGM's own trend, as the classic HUD shows it. + reading = Reading(mgdl: mgdl, date: latest.startDate, trend: deviceManager.glucoseDisplay(for: latest)?.trendType, delta: delta) + } else { + reading = nil + } + + let scheduled = temporaryPresetsManager.basalRateScheduleApplyingOverrideHistory?.value(at: now) + scheduledBasalRate = scheduled + // Presets change Loop's plan; without a temp basal the pump still delivers its programmed profile. + programmedBasalRate = settingsManager.settings.basalRateSchedule?.value(at: now) + basalDeliveryState = deviceManager.pumpManagerStatus?.basalDeliveryState + switch basalDeliveryState { + case .suspended?, .suspending?: suspended = true + default: suspended = false + } + + pump = deviceManager.pumpManager.map { manager in + device(name: manager.localizedTitle, highlight: deviceManager.pumpStatusHighlight, progress: deviceManager.pumpLifecycleProgress) + } + cgm = deviceManager.cgmManager.map { manager in + device(name: manager.localizedTitle, highlight: deviceManager.cgmStatusHighlight, progress: deviceManager.cgmLifecycleProgress) + } + + dosingAvailable = isOnboardingComplete() || deviceManager.pumpManager?.isOnboarded == true + preMealOn = temporaryPresetsManager.isPreMealTargetActive() + overrideName = preMealOn ? nil : temporaryPresetsManager.activePreset?.name + } + + private func device(name: String, highlight: DeviceStatusHighlight?, progress: DeviceLifecycleProgress?) -> Device { + if let highlight { + // Plugins wrap highlights onto two lines for the classic HUD ("Signal\nLoss"). + let message = highlight.localizedMessage.replacingOccurrences(of: "\n", with: " ") + return Device(name: name, message: message, state: highlight.state, symbol: highlight.imageName) + } + if let progress, progress.progressState == .warning || progress.progressState == .critical { + return Device(name: name, message: nil, state: progress.progressState == .critical ? .critical : .warning, endingSoon: true) + } + return Device(name: name, message: nil, state: nil) + } +} + +/// The buttons on the Now screen, wired to StatusTableViewController's existing flows. +struct NowActions { + var addCarbs: () -> Void = {} + var bolus: () -> Void = {} + var presets: () -> Void = {} + var showPrediction: () -> Void = {} + var showToday: () -> Void = {} + var showInsulin: () -> Void = {} + var showCarbs: () -> Void = {} + var pumpTapped: () -> Void = {} + var cgmTapped: () -> Void = {} + var loopStatusTapped: () -> Void = {} +} + +// MARK: - Header: title, status, hero, actions + +struct NowHeaderView: View { + @ObservedObject var model: NowModel + let actions: NowActions + + var body: some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s3) { + Text(NSLocalizedString("Now", comment: "Title at the top of the Now screen, showing current glucose and Loop status")) + .font(LoopDesign.Typeface.title) + .foregroundStyle(P.ink) + .accessibilityAddTraits(.isHeader) + statusRow + if !noticeItems.isEmpty { + notices + } + hero + actionRow + } + .padding(.horizontal, LoopDesign.Space.s4) + .padding(.top, LoopDesign.Space.s2) + .padding(.bottom, LoopDesign.Space.s2) + .frame(maxWidth: .infinity, alignment: .leading) + .background(P.surface) + .onReceive(Timer.publish(every: 30, on: .main, in: .common).autoconnect()) { model.now = $0 } + } + + // Status pills replace Loop's HUD icons with words. They wrap rather than scroll, so a device is never off-screen. + private var statusRow: some View { + FlowRow(spacing: LoopDesign.Space.s2) { + Button(action: actions.loopStatusTapped) { + StatusPill(text: loopText, dot: loopColor) + } + .accessibilityHint(NSLocalizedString("Shows when Loop last ran", comment: "VoiceOver hint for the Loop status pill and the Loop notice on the Now screen")) + Button(action: actions.pumpTapped) { + if let pump = model.pump { + StatusPill(text: pillText(pump), dot: pillColor(pump)) + } else { + StatusPill(text: NSLocalizedString("Add pump", comment: "Status pill on the Now screen when no pump is set up; tapping it starts pump setup"), dot: P.statusCritical) + } + } + .accessibilityHint(model.pump == nil + ? NSLocalizedString("Sets up a pump", comment: "VoiceOver hint for the Add pump status pill on the Now screen") + : NSLocalizedString("Opens pump settings", comment: "VoiceOver hint for the pump status pill and pump notice on the Now screen")) + Button(action: actions.cgmTapped) { + if let cgm = model.cgm { + StatusPill(text: pillText(cgm), dot: pillColor(cgm)) + } else { + StatusPill(text: NSLocalizedString("Add CGM", comment: "Status pill on the Now screen when no CGM is set up; tapping it starts CGM setup"), dot: P.statusCritical) + } + } + .accessibilityHint(model.cgm == nil + ? NSLocalizedString("Sets up a CGM", comment: "VoiceOver hint for the Add CGM status pill on the Now screen") + : NSLocalizedString("Opens CGM settings", comment: "VoiceOver hint for the CGM status pill and CGM notice on the Now screen")) + } + .buttonStyle(.plain) + } + + // A device problem or a stalled loop gets a notice in words under the pills, most serious first. + private var notices: some View { + let items = noticeItems + return VStack(spacing: LoopDesign.Space.s2) { + ForEach(items) { item in + Button(action: item.action) { + DeviceNotice(item: item) + } + .buttonStyle(.plain) + .accessibilityHint(item.hint) + } + } + } + + private var noticeItems: [DeviceNotice.Item] { + var items: [DeviceNotice.Item] = [] + if model.loopState == .failed, let last = model.lastLoopCompleted { + items.append(DeviceNotice.Item( + id: "loop", + severity: .critical, + symbol: "exclamationmark.arrow.circlepath", + title: String(format: NSLocalizedString("Loop hasn't run for %1$@", comment: "Notice title on the Now screen when Loop hasn't completed recently. (1: duration since Loop last ran, e.g. 16m)"), LoopFormat.ago(last, now: model.now)), + detail: NSLocalizedString("Insulin isn't being adjusted. Tap for details.", comment: "Notice detail on the Now screen when Loop hasn't completed recently"), + hint: NSLocalizedString("Shows when Loop last ran", comment: "VoiceOver hint for the Loop status pill and the Loop notice on the Now screen"), + action: actions.loopStatusTapped)) + } + // While suspended, Loop's own status row says so and offers Resume, so only a critical pump problem adds a notice. + if let pump = model.pump, let symbol = pump.symbol, let message = pump.message, + !model.suspended || pump.state == .critical { + let severity = DeviceNotice.Severity(pump.state) + items.append(DeviceNotice.Item( + id: "pump", + severity: severity, + symbol: symbol, + title: message, + detail: severity == .critical ? NSLocalizedString("Loop may not be giving insulin.", comment: "Notice detail on the Now screen under a critical pump problem reported by the pump") : nil, + hint: NSLocalizedString("Opens pump settings", comment: "VoiceOver hint for the pump status pill and pump notice on the Now screen"), + action: actions.pumpTapped)) + } + if let cgm = model.cgm, let symbol = cgm.symbol, let message = cgm.message { + let severity = DeviceNotice.Severity(cgm.state) + items.append(DeviceNotice.Item( + id: "cgm", + severity: severity, + symbol: symbol, + title: message, + detail: model.readingIsStale ? NSLocalizedString("Loop can't adjust insulin without readings.", comment: "Notice detail on the Now screen under a CGM problem when there is no recent glucose reading") : nil, + hint: NSLocalizedString("Opens CGM settings", comment: "VoiceOver hint for the CGM status pill and CGM notice on the Now screen"), + action: actions.cgmTapped)) + } + return items.sorted { $0.severity > $1.severity } + } + + private var loopText: String { + guard let last = model.lastLoopCompleted else { + if model.closedLoop { + return NSLocalizedString("Closed loop · not run yet", comment: "Status pill on the Now screen: closed loop is on but Loop has never completed") + } else if model.closedLoopPaused { + return NSLocalizedString("Closed loop paused · not run yet", comment: "Status pill on the Now screen: closed loop is switched on but paused (e.g. no CGM data), and Loop has never completed") + } else { + return NSLocalizedString("Open loop · not run yet", comment: "Status pill on the Now screen: closed loop is off and Loop has never completed") + } + } + let ago = LoopFormat.ago(last, now: model.now) + if model.loopState == .failed { + return String(format: NSLocalizedString("Loop failed · %1$@", comment: "Status pill on the Now screen: Loop hasn't completed for over 15 minutes. (1: duration since Loop last ran, e.g. 16m)"), ago) + } else if model.closedLoop { + return String(format: NSLocalizedString("Closed loop · %1$@", comment: "Status pill on the Now screen: closed loop is on and Loop last ran this long ago. (1: duration, e.g. 3m)"), ago) + } else if model.closedLoopPaused { + return String(format: NSLocalizedString("Closed loop paused · %1$@", comment: "Status pill on the Now screen: closed loop is switched on but paused (e.g. no CGM data), and Loop last ran this long ago. (1: duration, e.g. 3m)"), ago) + } else { + return String(format: NSLocalizedString("Open loop · %1$@", comment: "Status pill on the Now screen: closed loop is off (Loop recommends only) and Loop last ran this long ago. (1: duration, e.g. 3m)"), ago) + } + } + + /// Green only while closed loop is running; open loop that ran on time is neutral. + private var loopColor: Color { + switch model.loopState { + case .fresh: return model.closedLoop ? P.statusAutomated : model.closedLoopPaused ? P.statusWarning : P.inkMuted + case .stale: return P.statusWarning + case .failed, .never: return P.statusCritical + } + } + + /// A highlight (always a plugin message with a symbol) is spelled out in its notice, so its pill keeps to the device name. + private func pillText(_ device: NowModel.Device) -> String { + guard device.symbol == nil else { return device.name } + if device.endingSoon { + return String(format: NSLocalizedString("%1$@ · ending soon", comment: "Status pill on the Now screen when a pump pod or CGM sensor is near the end of its life. (1: device name from the pump or CGM plugin, e.g. Omnipod 5)"), device.name) + } + return device.name + } + + private func pillColor(_ device: NowModel.Device) -> Color? { + switch device.state { + case .critical?: return P.statusCritical + case .warning?: return P.statusWarning + default: return device.symbol == nil ? nil : P.inkMuted + } + } + + private var hero: some View { + LoopCard { + HStack(alignment: .top) { + VStack(alignment: .leading, spacing: 0) { + HStack(alignment: .center, spacing: LoopDesign.Space.s2) { + if let reading = model.reading, !model.readingIsStale { + Text(model.unit.format(reading.mgdl)) + .font(LoopDesign.Typeface.glucoseHero) + .foregroundStyle(P.ink) + .lineLimit(1) + .minimumScaleFactor(0.6) + if let trend = reading.trend { + Image(systemName: Self.symbol(for: trend)) + .font(.system(size: 30, weight: .bold)) + .foregroundStyle(P.glucose) + .accessibilityLabel(trend.localizedDescription) + } + } else { + Text(NSLocalizedString("No reading", comment: "Shown on the Now screen in place of the glucose value when there is no recent CGM reading")) + .font(.system(size: 34, weight: .bold, design: .rounded)) + .foregroundStyle(P.inkMuted) + } + } + Text(readingDetail) + .font(LoopDesign.Typeface.subhead) + .foregroundStyle(P.inkMuted) + if let rangePill { + StatusPill(text: rangePill.0, dot: rangePill.1) + .padding(.top, LoopDesign.Space.s1) + } + } + Spacer(minLength: LoopDesign.Space.s2) + VStack(alignment: .trailing, spacing: 2) { + if let reading = model.reading { + Text(LoopFormat.time(reading.date)) + } + if let target = model.targetRange { + Text(String(format: NSLocalizedString("Target %1$@–%2$@", comment: "Glucose target range on the Now screen hero card. (1: lower bound; 2: upper bound)"), model.unit.format(target.lowerBound), model.unit.format(target.upperBound))) + } + } + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + .padding(.top, LoopDesign.Space.s4) + } + .accessibilityElement(children: .combine) + + AdaptiveRow { + // As on the classic charts: insulin opens Loop's delivery history, carbs its absorption screen. + Button(action: actions.showInsulin) { + ValueTile(label: NSLocalizedString("IOB", comment: "Abbreviation for insulin on board; label of a tile on the Now screen")) { + Text(model.iob.map(LoopFormat.doseUnits) ?? "–") + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(P.insulinInk) + } + } + .buttonStyle(.plain) + .accessibilityHint(NSLocalizedString("Opens insulin delivery history", comment: "VoiceOver hint for the IOB tile on the Now screen")) + Button(action: actions.showCarbs) { + ValueTile(label: NSLocalizedString("COB", comment: "Abbreviation for carbs on board; label of a tile on the Now screen")) { + Text(model.cob.map(LoopFormat.grams) ?? "–") + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(P.carbsInk) + } + } + .buttonStyle(.plain) + .accessibilityHint(NSLocalizedString("Opens carb absorption", comment: "VoiceOver hint for the COB tile on the Now screen")) + ValueTile(label: NSLocalizedString("Basal", comment: "Label of a tile showing the current basal rate (Now screen) or the day's basal insulin total (Today so far totals)")) { + VStack(alignment: .leading, spacing: 0) { + HStack(alignment: .firstTextBaseline, spacing: 2) { + Text(model.basalRate.map { LoopFormat.number($0, decimals: 2) } ?? "–") + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(P.ink) + Text(NSLocalizedString("U/h", comment: "Abbreviation for insulin units per hour")) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + if model.suspended { + Text(NSLocalizedString("Suspended", comment: "Shown in the Basal tile on the Now screen when insulin delivery is suspended")) + .font(LoopDesign.Typeface.footnote.weight(.semibold)) + .foregroundStyle(P.criticalInk) + } else if let rate = model.basalRate, let scheduled = model.scheduledBasalRate { + Text(String(format: NSLocalizedString("%1$@ vs plan", comment: "Basal tile on the Now screen: how the current basal rate differs from the scheduled rate. (1: signed difference in U/h, e.g. +0.25)"), LoopFormat.signed(rate - scheduled))) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + .lineLimit(1) + .minimumScaleFactor(0.8) + } + } + } + } + .fixedSize(horizontal: false, vertical: true) + } + .opacity(model.readingIsStale && model.reading != nil ? 0.7 : 1) + } + + private var readingDetail: String { + guard let reading = model.reading else { return model.unit.unitName } + if model.readingIsStale { + return String(format: NSLocalizedString("Last reading %1$@ ago", comment: "Shown on the Now screen under No reading when the latest CGM reading is too old. (1: duration, e.g. 25m)"), LoopFormat.ago(reading.date, now: model.now)) + } + guard let delta = reading.delta else { return model.unit.unitName } + let change = model.unit.isMmol ? LoopFormat.signed(delta / GlucoseUnitStyle.mgdlPerMmol, decimals: 1) : LoopFormat.signed(delta, decimals: 0) + return String(format: NSLocalizedString("%1$@ · %2$@ in 5 min", comment: "Under the glucose value on the Now screen: the glucose unit and how much glucose changed over 5 minutes. (1: glucose unit, e.g. mmol/L; 2: signed change, e.g. +0.3)"), model.unit.unitName, change) + } + + /// Low and high get a pill with words; the number itself is never tinted. + private var rangePill: (String, Color)? { + guard let reading = model.reading, !model.readingIsStale else { return nil } + if reading.mgdl < 54 { return (NSLocalizedString("Urgent low", comment: "Pill under the glucose value on the Now screen when glucose is below 54 mg/dL (3.0 mmol/L)"), P.statusCritical) } + if reading.mgdl < 70 { return (NSLocalizedString("Low", comment: "Pill under the glucose value on the Now screen when glucose is below 70 mg/dL (3.9 mmol/L)"), P.statusCritical) } + if reading.mgdl > 250 { return (NSLocalizedString("High", comment: "Pill under the glucose value on the Now screen when glucose is above 250 mg/dL (13.9 mmol/L)"), P.statusWarning) } + return nil + } + + static func symbol(for trend: GlucoseTrend) -> String { + switch trend { + case .upUpUp: return "arrow.up.to.line" + case .upUp: return "chevron.up.2" + case .up: return "arrow.up" + case .flat: return "arrow.right" + case .down: return "arrow.down" + case .downDown: return "chevron.down.2" + case .downDownDown: return "arrow.down.to.line" + } + } + + private var actionRow: some View { + AdaptiveRow { + actionButton(NSLocalizedString("Add carbs", comment: "Button on the Now screen that opens carb entry"), systemImage: "fork.knife", fill: P.carbs, text: P.onFill, action: actions.addCarbs) + .disabled(!model.dosingAvailable) + .opacity(model.dosingAvailable ? 1 : 0.4) + actionButton(NSLocalizedString("Bolus", comment: "Button on the Now screen that opens the bolus screen"), systemImage: "syringe.fill", fill: P.insulin, text: P.onFill, action: actions.bolus) + .disabled(!model.dosingAvailable) + .opacity(model.dosingAvailable ? 1 : 0.4) + // Pre-meal and the other presets share Loop's Presets screen. + Button(action: actions.presets) { + actionLabel(presetsTitle, systemImage: "slider.horizontal.3", fill: presetsFill, text: P.ink) + } + .buttonStyle(.plain) + .accessibilityLabel(NSLocalizedString("Presets", comment: "Button on the Now screen that opens override presets (and pre-meal); also its VoiceOver label and menu item")) + .accessibilityValue(presetsActive ? presetsTitle : "") + } + .fixedSize(horizontal: false, vertical: true) + } + + private var presetsFill: Color { + model.preMealOn || model.overrideName != nil ? P.accent.opacity(0.18) : P.surfaceSunken + } + + private var presetsActive: Bool { + model.preMealOn || model.overrideName != nil + } + + private var presetsTitle: String { + if model.preMealOn { return NSLocalizedString("Pre-meal on", comment: "Presets button title on the Now screen while the pre-meal target is on") } + if let name = model.overrideName { return name } + return NSLocalizedString("Presets", comment: "Button on the Now screen that opens override presets (and pre-meal); also its VoiceOver label and menu item") + } + + private func actionButton(_ title: String, systemImage: String, fill: Color, text: Color, action: @escaping () -> Void) -> some View { + Button(action: action) { + actionLabel(title, systemImage: systemImage, fill: fill, text: text) + } + .buttonStyle(.plain) + } + + private func actionLabel(_ title: String, systemImage: String, fill: Color, text: Color) -> some View { + // Longer languages ("Agregar carbohidratos") wrap onto a second line rather than truncate. + Text(title) + .font(LoopDesign.Typeface.subhead.weight(.semibold)) + .lineLimit(2) + .multilineTextAlignment(.center) + .minimumScaleFactor(0.8) + .allowsTightening(true) + .foregroundStyle(text) + .padding(.horizontal, LoopDesign.Space.s1) + .padding(.vertical, LoopDesign.Space.s1) + .frame(maxWidth: .infinity, minHeight: 44, maxHeight: .infinity) + .background(fill, in: RoundedRectangle(cornerRadius: LoopDesign.Radius.md, style: .continuous)) + .contentShape(RoundedRectangle(cornerRadius: LoopDesign.Radius.md)) + } +} + +// MARK: - Charts: next 3 hours and today so far + +struct NowChartsView: View { + @ObservedObject var model: NowModel + let actions: NowActions + + var body: some View { + VStack(spacing: LoopDesign.Space.s4) { + predictionCard + todayCard + } + .padding(.horizontal, LoopDesign.Space.s4) + .padding(.top, LoopDesign.Space.s2) + .padding(.bottom, LoopDesign.Space.s6) + .frame(maxWidth: .infinity) + .background(P.surface) + } + + private var readings: [GlucosePoint] { + model.recentGlucose.filter { $0.date >= model.now.addingTimeInterval(-3 * 3600) } + } + + private var predictionCard: some View { + Button(action: actions.showPrediction) { + LoopCard { + CardHeader(title: NSLocalizedString("Next 3 hours", comment: "Title of the prediction chart card on the Now screen")) { + // Loop's eventual glucose is the end of its prediction, which can run past the three hours drawn. + if let last = model.prediction.last { + Text(String(format: NSLocalizedString("Eventually %1$@ %2$@", comment: "Prediction card on the Now screen: Loop's eventual predicted glucose. (1: glucose value; 2: glucose unit, e.g. mmol/L)"), model.unit.format(last.mgdl), model.unit.unitName)) + } + } + if readings.isEmpty && model.prediction.isEmpty { + ChartPlaceholder(message: model.glucoseHistoryError == nil + ? NSLocalizedString("No CGM data in the last 3 hours", comment: "Empty prediction chart on the Now screen") + : NSLocalizedString("Couldn't load recent CGM readings", comment: "Prediction chart on the Now screen when recent glucose couldn't be read")) + } else { + PredictionChartView(readings: readings, prediction: model.prediction, unit: model.unit, + targetBands: model.predictionTargets, now: model.now) + } + ChartLegend(items: [ + LegendItem(swatch: .dot(P.glucose), label: NSLocalizedString("Readings", comment: "Chart legend on the Now screen: dots are CGM glucose readings")), + LegendItem(swatch: .dash(P.glucose), label: NSLocalizedString("Loop prediction", comment: "Chart legend on the Now screen: dashed line is Loop's predicted glucose")), + ]) + if let error = model.glucoseHistoryError { + Text(String(format: NSLocalizedString("Recent readings unavailable: %1$@", comment: "Error under the prediction chart on the Now screen. (1: system error description)"), error)) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.criticalInk) + } + } + } + .buttonStyle(.plain) + .accessibilityHint(NSLocalizedString("Opens Loop's prediction breakdown", comment: "VoiceOver hint for the prediction card on the Now screen")) + } + + private var todayCard: some View { + Button(action: actions.showToday) { + if let error = model.historyError { + LoopCard { + CardHeader(title: DayTimelineCard.todayTitle) + ChartPlaceholder(message: String(format: NSLocalizedString("Couldn't load today's history: %1$@", comment: "Shown on the Now screen's Today so far card when history couldn't be read. (1: system error description)"), error)) + } + } else { + DayTimelineCard(title: DayTimelineCard.todayTitle, history: model.today, unit: model.unit, targetBands: model.todayTargets, + now: model.now, height: 230) + } + } + .buttonStyle(.plain) + .accessibilityHint(NSLocalizedString("Opens the full day", comment: "VoiceOver hint for the Today so far card on the Now screen")) + } +} + +/// A day on one timeline with its totals: Today so far on Now, and a one-day period on Trends. +struct DayTimelineCard: View { + let title: String + let history: DayHistory + let unit: GlucoseUnitStyle + let targetBands: [TargetBand] + var now: Date = Date() + var height: CGFloat = 230 + /// The bolus, basal and carb tiles; off where a Basal and bolus card follows. + var showsTotals = true + + static var todayTitle: String { + NSLocalizedString("Today so far", comment: "Title of the card on the Now screen showing today's insulin and carbs") + } + + var body: some View { + LoopCard { + CardHeader(title: title) { + HStack(spacing: 4) { + Text(LoopFormat.totalUnits(history.totalUnits)).foregroundStyle(P.insulinInk) + Text(verbatim: "·") + Text(LoopFormat.grams(history.carbGrams)).foregroundStyle(P.carbsInk) + } + } + InsulinTimelineView(history: history, unit: unit, targetBands: targetBands, now: now, height: height) + if showsTotals { + DayTotalsTiles(history: history) + } + ChartLegend(items: DayTotalsTiles.legend) + } + } +} + +/// Bolus, basal and carb totals under a timeline. +struct DayTotalsTiles: View { + let history: DayHistory + + static let legend: [LegendItem] = [ + LegendItem(swatch: .solid(P.bolus), label: NSLocalizedString("Bolus", comment: "Chart legend: solid bars are manual boluses")), + LegendItem(swatch: .hatch(P.bolus), label: NSLocalizedString("Automatic", comment: "Chart legend: hatched bars are automatic boluses given by Loop")), + LegendItem(swatch: .basal, label: NSLocalizedString("Basal given", comment: "Chart legend: filled area is basal insulin actually delivered")), + LegendItem(swatch: .dash(P.basalScheduled), label: NSLocalizedString("Scheduled", comment: "Chart legend: dashed line is the scheduled basal rate")), + ] + + var body: some View { + AdaptiveRow { + ValueTile(label: NSLocalizedString("Bolus", comment: "Label of a tile showing the day's total bolus insulin")) { + Text(LoopFormat.totalUnits(history.bolusUnits)) + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(P.insulinInk) + } + ValueTile(label: NSLocalizedString("Basal", comment: "Label of a tile showing the current basal rate (Now screen) or the day's basal insulin total (Today so far totals)")) { + // Plain ink: basal is the pale fill on the chart, and orange here read as bolus. + Text(LoopFormat.totalUnits(history.basalUnits)) + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(P.ink) + } + ValueTile(label: NSLocalizedString("Carbs", comment: "Label of a tile showing the day's total carbohydrate")) { + Text(LoopFormat.grams(history.carbGrams)) + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(P.carbsInk) + } + } + .fixedSize(horizontal: false, vertical: true) + } +} + +// MARK: - Notices + +/// One problem in words: what the device or Loop reports, what it means, and where to go. +struct DeviceNotice: View { + enum Severity: Int, Comparable { + case info, warning, critical + + init(_ state: DeviceStatusHighlightState?) { + switch state { + case .critical?: self = .critical + case .warning?: self = .warning + default: self = .info + } + } + + static func < (lhs: Severity, rhs: Severity) -> Bool { lhs.rawValue < rhs.rawValue } + } + + struct Item: Identifiable { + let id: String + let severity: Severity + let symbol: String + let title: String + let detail: String? + let hint: String + let action: () -> Void + } + + let item: Item + + private var tint: Color { + switch item.severity { + case .critical: return P.statusCritical + case .warning: return P.statusWarning + case .info: return P.inkMuted + } + } + + var body: some View { + HStack(alignment: .center, spacing: LoopDesign.Space.s3) { + Image(systemName: item.symbol) + .font(.system(size: 20, weight: .semibold)) + .foregroundStyle(item.severity == .critical ? P.criticalInk : tint) + .frame(width: 24) + .accessibilityHidden(true) + VStack(alignment: .leading, spacing: 2) { + Text(item.title) + .font(LoopDesign.Typeface.headline) + .foregroundStyle(item.severity == .critical ? P.criticalInk : P.ink) + if let detail = item.detail { + Text(detail) + .font(LoopDesign.Typeface.subhead) + .foregroundStyle(P.ink) + .fixedSize(horizontal: false, vertical: true) + } + } + Spacer(minLength: 0) + Image(systemName: "chevron.right") + .font(.footnote.weight(.semibold)) + .foregroundStyle(P.inkMuted) + .accessibilityHidden(true) + } + .padding(LoopDesign.Space.s3) + .frame(maxWidth: .infinity, alignment: .leading) + .background(tint.opacity(item.severity == .info ? 0.12 : 0.16), in: RoundedRectangle(cornerRadius: LoopDesign.Radius.lg, style: .continuous)) + .overlay( + RoundedRectangle(cornerRadius: LoopDesign.Radius.lg, style: .continuous) + .strokeBorder(tint.opacity(item.severity == .info ? 0 : 0.45), lineWidth: 1) + ) + .contentShape(Rectangle()) + .accessibilityElement(children: .combine) + } +} + +/// Lays its children out left to right and starts a new line when the next one won't fit. +struct FlowRow: Layout { + var spacing: CGFloat = 8 + + func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize { + let rows = arrange(width: proposal.width ?? .infinity, subviews: subviews) + let width = rows.map { $0.width }.max() ?? 0 + let height = rows.map { $0.height }.reduce(0, +) + spacing * CGFloat(max(rows.count - 1, 0)) + return CGSize(width: proposal.width ?? width, height: height) + } + + func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) { + var y = bounds.minY + for row in arrange(width: bounds.width, subviews: subviews) { + var x = bounds.minX + for index in row.indices { + let size = subviews[index].sizeThatFits(ProposedViewSize(width: bounds.width, height: nil)) + subviews[index].place(at: CGPoint(x: x, y: y), proposal: ProposedViewSize(width: min(size.width, bounds.width), height: size.height)) + x += min(size.width, bounds.width) + spacing + } + y += row.height + spacing + } + } + + private struct Row { + var indices: [Int] = [] + var width: CGFloat = 0 + var height: CGFloat = 0 + } + + private func arrange(width: CGFloat, subviews: Subviews) -> [Row] { + var rows: [Row] = [] + var row = Row() + for index in subviews.indices { + let size = subviews[index].sizeThatFits(ProposedViewSize(width: width, height: nil)) + let itemWidth = min(size.width, width) + if !row.indices.isEmpty && row.width + spacing + itemWidth > width { + rows.append(row) + row = Row() + } + row.width += (row.indices.isEmpty ? 0 : spacing) + itemWidth + row.height = max(row.height, size.height) + row.indices.append(index) + } + if !row.indices.isEmpty { rows.append(row) } + return rows + } +} diff --git a/Loop/Redesign/TrendsComponents.swift b/Loop/Redesign/TrendsComponents.swift new file mode 100644 index 0000000000..0a2c29feae --- /dev/null +++ b/Loop/Redesign/TrendsComponents.swift @@ -0,0 +1,825 @@ +// +// TrendsComponents.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import Charts + +private typealias P = LoopDesign.Palette + +// MARK: - RangeSelector + +enum TrendsPeriod: Int, CaseIterable, Identifiable { + case day = 1 + case week = 7 + case twoWeeks = 14 + case month = 30 + case quarter = 90 + + var id: Int { rawValue } + + var label: String { + self == .day + ? NSLocalizedString("Day (Trends period)", value: "Day", comment: "Trends period picker: a period of one calendar day (not daytime)") + : String(format: NSLocalizedString("%1$@ d", comment: "Trends period picker, short label for a period of several days, e.g. 7 d. (1: number of days)"), + LoopFormat.number(Double(rawValue), decimals: 0)) + } + + var accessibilityName: String { + self == .day + ? NSLocalizedString("Day (Trends period)", value: "Day", comment: "Trends period picker: a period of one calendar day (not daytime)") + : String.localizedStringWithFormat(NSLocalizedString("%lld days", comment: "Trends period picker, VoiceOver name for a period of several days. (1: number of days)"), rawValue) + } + + /// The period ending on `endDay` (inclusive), cut off at `now` when it ends today. + func interval(endingOn endDay: Date, now: Date = Date(), calendar: Calendar = .current) -> DateInterval { + let endOfDay = calendar.date(byAdding: .day, value: 1, to: calendar.startOfDay(for: endDay))! + let start = calendar.date(byAdding: .day, value: -rawValue, to: endOfDay)! + return DateInterval(start: start, end: min(endOfDay, now)) + } +} + +struct RangeSelectorView: View { + @Binding var period: TrendsPeriod + @Binding var endDay: Date + var now: Date = Date() + + private var calendar: Calendar { .current } + + private var canStepForward: Bool { + !calendar.isDate(endDay, inSameDayAs: now) && endDay < now + } + + var body: some View { + VStack(spacing: LoopDesign.Space.s3) { + HStack(spacing: 2) { + ForEach(TrendsPeriod.allCases) { option in + Button { + withAnimation(.snappy(duration: 0.2)) { period = option } + } label: { + Text(option.label) + .font(.footnote.weight(.semibold)) + .foregroundStyle(P.ink) + .frame(maxWidth: .infinity, minHeight: 30) + .background { + if option == period { + Capsule().fill(P.controlThumb).shadow(color: .black.opacity(0.12), radius: 3, y: 1) + } + } + .contentShape(Capsule()) + } + .buttonStyle(.plain) + .accessibilityLabel(option.accessibilityName) + .accessibilityAddTraits(option == period ? .isSelected : []) + } + } + .padding(2) + .background(P.surfaceSunken, in: Capsule()) + + HStack { + StepButton(systemName: "chevron.left", label: NSLocalizedString("Previous period", comment: "VoiceOver label for the Trends button that moves back one period")) { step(-1) } + Spacer() + Text(LoopFormat.range(period.interval(endingOn: endDay, now: now).start, endDay)) + .font(LoopDesign.Typeface.headline.monospacedDigit()) + .foregroundStyle(P.ink) + Spacer() + StepButton(systemName: "chevron.right", label: NSLocalizedString("Next period", comment: "VoiceOver label for the Trends button that moves forward one period"), enabled: canStepForward) { step(1) } + } + } + } + + private func step(_ direction: Int) { + guard let next = calendar.date(byAdding: .day, value: direction * period.rawValue, to: endDay) else { return } + endDay = min(next, now) + } +} + +// MARK: - StatGrid + +struct StatTile: Identifiable { + let label: String + let value: String + let unit: String? + let detail: String? + var valueColor: Color = LoopDesign.Palette.ink + var id: String { label } +} + +struct StatGridView: View { + @Environment(\.dynamicTypeSize) private var typeSize + let tiles: [StatTile] + + /// Pairs of tiles, so both tiles in a row take the taller one's height; one per row at accessibility sizes. + private var rows: [[StatTile]] { + let shown = Array(tiles.prefix(6)) + let perRow = typeSize.isAccessibilitySize ? 1 : 2 + return stride(from: 0, to: shown.count, by: perRow).map { Array(shown[$0.. some View { + VStack(alignment: .leading, spacing: 2) { + Text(tile.label) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + HStack(alignment: .firstTextBaseline, spacing: 2) { + Text(tile.value) + .font(LoopDesign.Typeface.statValue) + .foregroundStyle(tile.valueColor) + .minimumScaleFactor(0.7) + .lineLimit(1) + if let unit = tile.unit { + Text(unit) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + } + if let detail = tile.detail { + Text(detail) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + .lineLimit(2) + } + } + .padding(LoopDesign.Space.s3) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + .background(P.surfaceSunken, in: RoundedRectangle(cornerRadius: LoopDesign.Radius.md, style: .continuous)) + .accessibilityElement(children: .combine) + } +} + +// MARK: - TimeInRange + +extension LoopHistoryMath.RangeBand { + /// The band's name in the user's language. + var localizedName: String { + switch self { + case .veryHigh: return NSLocalizedString("Very high", comment: "Time in range band: glucose above 250 mg/dL (13.9 mmol/L)") + case .high: return NSLocalizedString("High", comment: "Time in range band: glucose 181–250 mg/dL (10.1–13.9 mmol/L)") + case .inRange: return NSLocalizedString("In range", comment: "Time in range band: glucose 70–180 mg/dL (3.9–10.0 mmol/L)") + case .low: return NSLocalizedString("Low", comment: "Time in range band: glucose 54–69 mg/dL (3.0–3.8 mmol/L)") + case .veryLow: return NSLocalizedString("Very low", comment: "Time in range band: glucose below 54 mg/dL (3.0 mmol/L)") + } + } + + /// Consensus thresholds with the user's decimal separator, e.g. "3,9–10,0". + func localizedThresholds(_ unit: GlucoseUnitStyle) -> String { + let decimals = unit.isMmol ? 1 : 0 + let n: (Double) -> String = { LoopFormat.number($0, decimals: decimals) } + switch (self, unit.isMmol) { + case (.veryHigh, true): return "> " + n(13.9) + case (.high, true): return n(10.1) + "–" + n(13.9) + case (.inRange, true): return n(3.9) + "–" + n(10.0) + case (.low, true): return n(3.0) + "–" + n(3.8) + case (.veryLow, true): return "< " + n(3.0) + case (.veryHigh, false): return "> " + n(250) + case (.high, false): return n(181) + "–" + n(250) + case (.inRange, false): return n(70) + "–" + n(180) + case (.low, false): return n(54) + "–" + n(69) + case (.veryLow, false): return "< " + n(54) + } + } +} + +/// "12%" in the user's language. +private func percentText(_ value: Double, decimals: Int = 0) -> String { + String(format: NSLocalizedString("%1$@%%", comment: "A percentage. (1: number)"), LoopFormat.number(value, decimals: decimals)) +} + +struct TimeInRangeView: View { + @Environment(\.dynamicTypeSize) private var typeSize + + /// Fractions per band, 0–1. + let fractions: [LoopHistoryMath.RangeBand: Double] + let unit: GlucoseUnitStyle + + private var percentages: [LoopHistoryMath.RangeBand: Int] { LoopHistoryMath.roundedPercentages(fractions) } + + static func color(_ band: LoopHistoryMath.RangeBand) -> Color { + switch band { + case .veryHigh: return P.rangeVeryHigh + case .high: return P.rangeHigh + case .inRange: return P.rangeIn + case .low: return P.rangeLow + case .veryLow: return P.rangeVeryLow + } + } + + var body: some View { + HStack(alignment: .top, spacing: LoopDesign.Space.s4) { + bar + .frame(width: 14) + VStack(spacing: LoopDesign.Space.s2) { + ForEach(LoopHistoryMath.RangeBand.allCases) { band in + row(band) + } + } + } + .fixedSize(horizontal: false, vertical: true) + } + + private var bar: some View { + GeometryReader { geometry in + let minimum: CGFloat = 4 + let bands = LoopHistoryMath.RangeBand.allCases + let raw = bands.map { CGFloat(fractions[$0] ?? 0) } + let floors = raw.map { $0 > 0 ? max(minimum, $0 * geometry.size.height) : 0 } + let spare = geometry.size.height - floors.reduce(0, +) + // Trim the space the minimums borrowed from the largest band. + let largest = raw.indices.max { raw[$0] < raw[$1] } ?? 2 + VStack(spacing: 1) { + ForEach(Array(bands.enumerated()), id: \.offset) { index, band in + let height = index == largest ? max(0, floors[index] + spare) : floors[index] + if height > 0 { + Rectangle().fill(Self.color(band)).frame(height: max(0, height - 1)) + } + } + } + .clipShape(Capsule()) + } + .accessibilityHidden(true) + } + + private func row(_ band: LoopHistoryMath.RangeBand) -> some View { + let fraction = fractions[band] ?? 0 + let hours = fraction * 24 + let thresholds = Text(band.localizedThresholds(unit)) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + return VStack(alignment: .leading, spacing: 0) { + HStack(alignment: .firstTextBaseline, spacing: LoopDesign.Space.s2) { + Text(percentText(Double(percentages[band] ?? 0))) + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(P.ink) + .frame(minWidth: typeSize.isAccessibilitySize ? nil : 52, alignment: .trailing) + Text(band.localizedName) + .font(LoopDesign.Typeface.subhead) + .foregroundStyle(P.ink) + if !typeSize.isAccessibilitySize { + thresholds + } + Spacer(minLength: LoopDesign.Space.s1) + Text(String(format: NSLocalizedString("%1$@ h", comment: "Time in range row: average hours a day spent in the band, abbreviated. (1: hours with one decimal)"), + LoopFormat.number(hours, decimals: 1))) + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + .foregroundStyle(P.inkMuted) + } + if typeSize.isAccessibilitySize { + thresholds + } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(String(format: NSLocalizedString("%1$@, %2$@ %3$@: %4$@ percent, %5$@ hours a day", comment: "VoiceOver label for a Time in range row. (1: band name, e.g. In range, 2: glucose thresholds, e.g. 3.9–10.0, 3: glucose unit, 4: percentage number, 5: average hours a day with one decimal)"), + band.localizedName, band.localizedThresholds(unit), unit.unitName, + LoopFormat.number(Double(percentages[band] ?? 0), decimals: 0), LoopFormat.number(hours, decimals: 1))) + } +} + +// MARK: - AGP + +struct TrendsAGPChart: View { + let slots: [LoopHistoryMath.AGPSlot] + let readings: [GlucosePoint] + let days: Int + let unit: GlucoseUnitStyle + let targetRange: ClosedRange? + var height: CGFloat = 180 + + private func v(_ mgdl: Double) -> Double { + min(max(unit.value(mgdl), unit.agpDomain.lowerBound), unit.agpDomain.upperBound) + } + + private static let hourTicks = [0, 360, 720, 1080, 1440] + + private static func label(minute: Int) -> String { + let minute = minute % 1440 + let date = Calendar.current.date(bySettingHour: minute / 60, minute: minute % 60, second: 0, of: Date())! + return DayAxis.hourLabel(date) + } + + var enoughDays: Bool { days >= 5 } + + var body: some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + if readings.isEmpty { + ChartPlaceholder(message: NSLocalizedString("No CGM data in this period", comment: "Trends chart placeholder when the period has no glucose readings"), height: height) + } else { + chart.frame(height: height) + if !enoughDays { + Text(String(format: NSLocalizedString("Not enough days for a pattern: %1$@ of 5", comment: "Trends Daily pattern footnote when fewer than 5 days have readings; the chart shows raw readings instead. (1: days with readings)"), + LoopFormat.number(Double(days), decimals: 0))) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + } + } + } + + private func minuteOfDay(_ date: Date) -> Int { + let parts = Calendar.current.dateComponents([.hour, .minute], from: date) + return (parts.hour ?? 0) * 60 + (parts.minute ?? 0) + } + + private var chart: some View { + Chart { + if let targetRange { + RectangleMark(xStart: .value("Start", 0), xEnd: .value("End", 1440), + yStart: .value("Low", v(targetRange.lowerBound)), yEnd: .value("High", v(targetRange.upperBound))) + .foregroundStyle(P.targetBand) + } + if enoughDays { + ForEach(slots, id: \.minute) { slot in + AreaMark(x: .value("Time", slot.minute), yStart: .value("5%", v(slot.p5)), yEnd: .value("95%", v(slot.p95)), series: .value("Band", "outer")) + .foregroundStyle(P.agpOuter) + .interpolationMethod(.monotone) + } + ForEach(slots, id: \.minute) { slot in + AreaMark(x: .value("Time", slot.minute), yStart: .value("25%", v(slot.p25)), yEnd: .value("75%", v(slot.p75)), series: .value("Band", "inner")) + .foregroundStyle(P.agpInner) + .interpolationMethod(.monotone) + } + ForEach(slots, id: \.minute) { slot in + LineMark(x: .value("Time", slot.minute), y: .value("Median", v(slot.p50)), series: .value("Band", "median")) + .foregroundStyle(P.glucose) + .lineStyle(StrokeStyle(lineWidth: 2.5)) + .interpolationMethod(.monotone) + } + } else { + ForEach(Array(readings.enumerated()), id: \.offset) { _, point in + PointMark(x: .value("Time", minuteOfDay(point.date)), y: .value("Glucose", v(point.mgdl))) + .symbolSize(8) + .foregroundStyle(P.glucose) + } + } + } + .chartXScale(domain: 0...1440) + .chartYScale(domain: unit.agpDomain) + .chartXAxis { + AxisMarks(values: Self.hourTicks) { value in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel { + if let minute = value.as(Int.self) { Text(Self.label(minute: minute)) } + } + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.inkMuted) + } + } + .chartYAxis { + AxisMarks(position: .leading, values: unit.agpTicks) { _ in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel().font(LoopDesign.Typeface.caption).foregroundStyle(P.inkMuted) + } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(accessibilitySummary) + } + + private var accessibilitySummary: String { + guard enoughDays, let high = slots.max(by: { $0.p50 < $1.p50 }), let low = slots.min(by: { $0.p50 < $1.p50 }) else { + return NSLocalizedString("Daily pattern: not enough days", comment: "VoiceOver label for the Trends Daily pattern chart when fewer than 5 days have readings") + } + let span = String.localizedStringWithFormat(NSLocalizedString("%lld days", comment: "A number of days, e.g. a Trends period or how many days are averaged. (1: number of days)"), days) + return String(format: NSLocalizedString("Daily pattern over %1$@. Median highest %2$@ at %3$@, lowest %4$@ at %5$@", comment: "VoiceOver label for the Trends Daily pattern chart. (1: days with readings, e.g. 14 days; 2: highest median glucose; 3: time of day; 4: lowest median glucose; 5: time of day)"), + span, unit.format(high.p50), Self.label(minute: high.minute), unit.format(low.p50), Self.label(minute: low.minute)) + } +} + +// MARK: - InsulinSplit + +/// Basal against bolus in one capsule: basal, then manual bolus, then automatic bolus. +struct InsulinSplitBar: View { + let split: InsulinSplit + /// A 6-point line for list headers. It is still tall enough to show the automatic bolus stripes. + var hairline = false + @Environment(\.colorScheme) private var scheme + + private enum Part: CaseIterable { case basal, manual, automatic } + + private func units(_ part: Part) -> Double { + switch part { + case .basal: return split.basal + // Unclassified bolus draws as plain bolus. + case .manual: return split.manualBolus + split.unclassifiedBolus + case .automatic: return split.automaticBolus + } + } + + var body: some View { + GeometryReader { geometry in + let parts = Part.allCases.filter { units($0) > 0 } + let gap: CGFloat = hairline ? 1.5 : 2.5 + let width = geometry.size.width - gap * CGFloat(max(0, parts.count - 1)) + let minimum: CGFloat = hairline ? 2 : 4 + let widths = parts.map { max(minimum, width * units($0) / max(split.total, .ulpOfOne)) } + // Take what the minimums add from the widest part, so the bar keeps its length. + let excess = widths.reduce(0, +) - width + let widest = widths.indices.max { widths[$0] < widths[$1] } + HStack(spacing: gap) { + ForEach(Array(parts.enumerated()), id: \.offset) { index, part in + segment(part).frame(width: max(0, widths[index] - (index == widest ? excess : 0))) + } + } + .clipShape(Capsule()) + } + .frame(height: hairline ? 6 : 14) + .accessibilityHidden(true) + } + + @ViewBuilder + private func segment(_ part: Part) -> some View { + switch part { + case .basal: + Rectangle().fill(LoopDesign.Palette.basal) + .overlay(alignment: .trailing) { + if !hairline { Rectangle().fill(LoopDesign.Palette.basalEdge).frame(width: 2) } + } + case .manual: + Rectangle().fill(LoopDesign.Palette.bolus) + case .automatic: + Rectangle().fill(Hatch.paint(LoopDesign.Palette.bolus, scheme: scheme)) + } + } +} + +/// The basal and bolus card body: the bar, units and shares, how the bolus divides, and the total. +struct InsulinSplitView: View { + let split: InsulinSplit + /// Today so far, rather than a whole day or a per-day average. + var partial = false + /// What the basal schedule delivers over the same time, shown under the basal row. + var scheduledBasal: Double? + /// Today against a usual day, e.g. "Usually 28.4 U by 19:46", under the total. + var usual: String? + + var body: some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s3) { + InsulinSplitBar(split: split) + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + row(.basal, NSLocalizedString("Basal", comment: "Basal and bolus row: insulin delivered as basal"), split.basal, split.basalPercent) + if let scheduledBasal { + part(.dash(LoopDesign.Palette.basalScheduled), String(format: NSLocalizedString("Scheduled %1$@", comment: "Basal and bolus: what the basal schedule delivers over the same time, under the basal row. (1: units, e.g. 18.0 U)"), LoopFormat.totalUnits(scheduledBasal))) + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + .foregroundStyle(LoopDesign.Palette.inkMuted) + .padding(.leading, 10 + LoopDesign.Space.s2) + } + row(.solid(LoopDesign.Palette.bolus), NSLocalizedString("Bolus", comment: "Basal and bolus row: insulin delivered as bolus, manual and automatic"), split.bolus, split.bolusPercent) + if split.isClassified && split.bolus > 0 { + FlowLayout(spacing: LoopDesign.Space.s3, lineSpacing: 2) { + part(.solid(LoopDesign.Palette.bolus), String(format: NSLocalizedString("Manual %1$@", comment: "Basal and bolus: bolus the person gave. (1: units, e.g. 16.2 U)"), LoopFormat.totalUnits(split.manualBolus))) + part(.hatch(LoopDesign.Palette.bolus), String(format: NSLocalizedString("Automatic %1$@", comment: "Basal and bolus: bolus Loop gave automatically. (1: units, e.g. 5.4 U)"), LoopFormat.totalUnits(split.automaticBolus))) + } + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + .foregroundStyle(LoopDesign.Palette.inkMuted) + .padding(.leading, 10 + LoopDesign.Space.s2) + } + Divider().padding(.vertical, 2) + HStack(alignment: .firstTextBaseline) { + Text(partial + ? NSLocalizedString("Total so far", comment: "Basal and bolus total row for today, which isn't over yet") + : NSLocalizedString("Total", comment: "Basal and bolus total row: basal plus bolus")) + .font(LoopDesign.Typeface.subhead.weight(.semibold)) + .foregroundStyle(LoopDesign.Palette.ink) + Spacer() + Text(LoopFormat.totalUnits(split.total)) + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(LoopDesign.Palette.insulinInk) + } + if let usual { + Text(usual) + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + .foregroundStyle(LoopDesign.Palette.inkMuted) + .frame(maxWidth: .infinity, alignment: .trailing) + } + } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(Self.accessibilityLabel(split, partial: partial, scheduledBasal: scheduledBasal, usual: usual)) + } + + private func row(_ swatch: LegendItem.Swatch, _ label: String, _ units: Double, _ percent: Int) -> some View { + HStack(alignment: .firstTextBaseline, spacing: LoopDesign.Space.s2) { + LegendSwatch(swatch: swatch).alignmentGuide(.firstTextBaseline) { $0[.bottom] - 1 } + Text(label) + .font(LoopDesign.Typeface.subhead) + .foregroundStyle(LoopDesign.Palette.ink) + Spacer() + Text(LoopFormat.totalUnits(units)) + .font(LoopDesign.Typeface.body.weight(.semibold).monospacedDigit()) + .foregroundStyle(LoopDesign.Palette.ink) + Text(verbatim: "\(percent)%") + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + .foregroundStyle(LoopDesign.Palette.inkMuted) + .frame(minWidth: 38, alignment: .trailing) + } + } + + private func part(_ swatch: LegendItem.Swatch, _ text: String) -> some View { + HStack(spacing: LoopDesign.Space.s1) { + LegendSwatch(swatch: swatch) + Text(text) + } + } + + static func accessibilityLabel(_ split: InsulinSplit, partial: Bool, scheduledBasal: Double? = nil, usual: String? = nil) -> String { + var parts = [ + String(format: NSLocalizedString("Basal %1$@, %2$@ percent", comment: "VoiceOver: basal units and share. (1: units, 2: percentage number)"), LoopFormat.totalUnits(split.basal), "\(split.basalPercent)"), + String(format: NSLocalizedString("Bolus %1$@, %2$@ percent", comment: "VoiceOver: bolus units and share. (1: units, 2: percentage number)"), LoopFormat.totalUnits(split.bolus), "\(split.bolusPercent)"), + ] + if split.isClassified && split.bolus > 0 { + parts.append(String(format: NSLocalizedString("%1$@ manual, %2$@ automatic", comment: "VoiceOver: how the bolus divides. (1: manual units, 2: automatic units)"), + LoopFormat.totalUnits(split.manualBolus), LoopFormat.totalUnits(split.automaticBolus))) + } + parts.append(String(format: partial + ? NSLocalizedString("Total so far %1$@", comment: "VoiceOver: today's total insulin so far. (1: units)") + : NSLocalizedString("Total %1$@", comment: "VoiceOver: total insulin. (1: units)"), + LoopFormat.totalUnits(split.total))) + if let scheduledBasal { + parts.insert(String(format: NSLocalizedString("Scheduled %1$@", comment: "Basal and bolus: what the basal schedule delivers over the same time, under the basal row. (1: units, e.g. 18.0 U)"), LoopFormat.totalUnits(scheduledBasal)), at: 1) + } + if let usual { + parts.append(usual) + } + return parts.joined(separator: ". ") + } +} + +/// A day's basal and bolus under a list header: the line, then each part keyed the way the charts and rows draw it. +/// The header shows the day's total itself. +struct InsulinSplitLine: View { + let split: InsulinSplit + var partial = false + + var body: some View { + VStack(alignment: .leading, spacing: 6) { + InsulinSplitBar(split: split, hairline: true) + FlowLayout(spacing: LoopDesign.Space.s3, lineSpacing: 2) { + part(.basal, Text(NSLocalizedString("Basal", comment: "Basal and bolus row: insulin delivered as basal")) + Text(verbatim: " ") + Text(LoopFormat.number(split.basal, decimals: 1))) + if split.isClassified { + if split.manualBolus > 0 { + part(.solid(LoopDesign.Palette.bolus), Text(String(format: NSLocalizedString("Manual %1$@", comment: "Basal and bolus: bolus the person gave. (1: units, e.g. 16.2 U)"), LoopFormat.number(split.manualBolus, decimals: 1)))) + } + if split.automaticBolus > 0 { + part(.hatch(LoopDesign.Palette.bolus), Text(String(format: NSLocalizedString("Automatic %1$@", comment: "Basal and bolus: bolus Loop gave automatically. (1: units, e.g. 5.4 U)"), LoopFormat.number(split.automaticBolus, decimals: 1)))) + } + } else { + part(.solid(LoopDesign.Palette.bolus), Text(NSLocalizedString("Bolus", comment: "Basal and bolus row: insulin delivered as bolus, manual and automatic")) + Text(verbatim: " ") + Text(LoopFormat.number(split.bolus, decimals: 1))) + } + } + .font(LoopDesign.Typeface.footnote.monospacedDigit()) + .foregroundStyle(LoopDesign.Palette.inkMuted) + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(InsulinSplitView.accessibilityLabel(split, partial: partial)) + } + + private func part(_ swatch: LegendItem.Swatch, _ text: Text) -> some View { + HStack(spacing: LoopDesign.Space.s1) { + LegendSwatch(swatch: swatch) + text + } + } +} + +// MARK: - InsulinDailyTotals + +struct InsulinDailyTotalsView: View { + let totals: [LoopHistoryMath.DayTotal] + /// Weekly averages instead of days, for periods past 30 days. + let weekly: Bool + /// Calculated from the original daily totals, even when the bars are weekly averages. + let average: Double + var height: CGFloat = 170 + var onSelectDay: ((Date) -> Void)? = nil + @Environment(\.colorScheme) private var scheme + + private var yMax: Double { + let top = max(totals.map(\.total).max() ?? 0, average) + return max(10, IOBCOBChartView.niceStep(top / 4) * 5) + } + + var body: some View { + if totals.allSatisfy({ $0.total == 0 }) { + ChartPlaceholder(message: NSLocalizedString("No insulin recorded in this period", comment: "Trends Insulin per day chart placeholder when no insulin was delivered in the period"), height: height) + } else { + chart.frame(height: height) + } + } + + private var unitWidth: Calendar.Component { weekly ? .weekOfYear : .day } + + private var chart: some View { + Chart { + ForEach(totals) { day in + BarMark(x: .value("Day", day.day, unit: unitWidth), yStart: .value("Base", 0), yEnd: .value("Basal", day.basal), width: .ratio(0.7)) + .foregroundStyle(P.basal) + BarMark(x: .value("Day", day.day, unit: unitWidth), yStart: .value("Basal", max(0, day.basal - yMax * 0.006)), yEnd: .value("Edge", day.basal), width: .ratio(0.7)) + .foregroundStyle(P.basalEdge) + // A thin gap under each bolus part, so it never touches the part below it + let gap = yMax * 0.01 + let manualTop = day.basal + day.split.manualBolus + day.split.unclassifiedBolus + BarMark(x: .value("Day", day.day, unit: unitWidth), yStart: .value("Basal", day.basal + (manualTop - day.basal > gap * 2 ? gap : 0)), yEnd: .value("Bolus", manualTop), width: .ratio(0.7)) + .foregroundStyle(P.bolus) + if day.split.automaticBolus > 0 { + BarMark(x: .value("Day", day.day, unit: unitWidth), yStart: .value("Bolus", manualTop + (day.total - manualTop > gap * 2 ? gap : 0)), yEnd: .value("Total", day.total), width: .ratio(0.7)) + .foregroundStyle(Hatch.paint(P.bolus, scheme: scheme)) + } + } + RuleMark(y: .value("Average", average)) + .foregroundStyle(P.ink) + .lineStyle(StrokeStyle(lineWidth: 1, dash: [4, 3])) + .annotation(position: .top, alignment: .trailing, spacing: 2) { + Text(LoopFormat.number(average, decimals: 1)) + .font(LoopDesign.Typeface.caption.weight(.semibold)) + .foregroundStyle(P.ink) + } + } + .chartYScale(domain: 0...yMax) + .chartXAxis { + AxisMarks(values: axisDates) { value in + AxisValueLabel(centered: true) { + if let date = value.as(Date.self) { + Text(axisLabel(date)) + .multilineTextAlignment(.center) + } + } + .font(LoopDesign.Typeface.caption) + .foregroundStyle(P.inkMuted) + } + } + .chartYAxis { + AxisMarks(position: .leading) { _ in + AxisGridLine().foregroundStyle(P.grid) + AxisValueLabel().font(LoopDesign.Typeface.caption).foregroundStyle(P.inkMuted) + } + } + .chartOverlay { proxy in + GeometryReader { geometry in + Rectangle().fill(.clear).contentShape(Rectangle()) + .onTapGesture { location in + guard let onSelectDay, !weekly, let frame = proxy.plotFrame else { return } + let x = location.x - geometry[frame].origin.x + if let date: Date = proxy.value(atX: x), + let day = totals.min(by: { abs($0.day.addingTimeInterval(43200).timeIntervalSince(date)) < abs($1.day.addingTimeInterval(43200).timeIntervalSince(date)) }) { + onSelectDay(day.day) + } + } + } + } + .accessibilityElement(children: .ignore) + .accessibilityLabel(String(format: weekly + ? NSLocalizedString("Insulin per day, weekly average, average %1$@", comment: "VoiceOver label for the Trends Insulin per day chart when bars are weekly averages. (1: average insulin per day, e.g. 32.1 U)") + : NSLocalizedString("Insulin per day, average %1$@", comment: "VoiceOver label for the Trends Insulin per day chart. (1: average insulin per day, e.g. 32.1 U)"), + LoopFormat.totalUnits(average))) + } + + private var axisDates: [Date] { + if weekly { + let stride = max(1, Int(ceil(Double(totals.count) / 6))) + return totals.enumerated().compactMap { index, total in index % stride == 0 ? total.day : nil } + } + if totals.count > 14 { + return totals.map(\.day).filter { Calendar.current.component(.weekday, from: $0) == 2 } + } + return totals.map(\.day) + } + + private func axisLabel(_ date: Date) -> String { + if weekly { + return date.formatted(.dateTime.day().month(.abbreviated)) + } + let weekday = String(date.formatted(.dateTime.weekday(.narrow))) + if totals.count <= 14 { + let first = totals.first?.day == date, last = totals.last?.day == date + let isMonday = Calendar.current.component(.weekday, from: date) == 2 + return first || last || isMonday ? "\(weekday)\n\(date.formatted(.dateTime.day()))" : weekday + } + // 30 days: label every Monday only. + return Calendar.current.component(.weekday, from: date) == 2 ? date.formatted(.dateTime.day().month(.abbreviated)) : "" + } +} + +// MARK: - LoopModeBar + +struct LoopModeBarView: View { + let spans: [LoopModeSpan] + + private var total: TimeInterval { spans.reduce(0) { $0 + $1.duration } } + + static func color(_ mode: LoopModeSpan.Mode) -> Color { + switch mode { + case .closed: return P.statusAutomated + case .limited: return P.statusWarning + case .open: return P.inkMuted + } + } + + static func name(_ mode: LoopModeSpan.Mode) -> String { + switch mode { + case .closed: return NSLocalizedString("Closed loop", comment: "Trends Loop status: time Loop was running in closed loop") + case .limited: return NSLocalizedString("Limited", comment: "Trends Loop status: time closed loop was on but Loop wasn't completing runs") + case .open: return NSLocalizedString("Open loop / manual", comment: "Trends Loop status: time closed loop was switched off") + } + } + + private let modes: [LoopModeSpan.Mode] = [.closed, .limited, .open] + + var body: some View { + if total <= 0 { + ChartPlaceholder(message: NSLocalizedString("No loop runs recorded in this period", comment: "Trends Loop status placeholder when there is no Loop run history for the period"), height: 60) + } else { + VStack(spacing: LoopDesign.Space.s3) { + bar.frame(height: 10) + ForEach(modes, id: \.self) { mode in + row(mode) + } + } + } + } + + private func fraction(_ mode: LoopModeSpan.Mode) -> Double { + LoopHistoryMath.duration(of: mode, in: spans) / total + } + + private var bar: some View { + GeometryReader { geometry in + let minimum: CGFloat = 4 + let widths = modes.map { fraction($0) > 0 ? max(minimum, fraction($0) * geometry.size.width) : 0 } + let excess = widths.reduce(0, +) - geometry.size.width + HStack(spacing: 1) { + ForEach(Array(modes.enumerated()), id: \.offset) { index, mode in + if widths[index] > 0 { + Rectangle() + .fill(Self.color(mode)) + .frame(width: max(0, index == 0 ? widths[index] - excess - 2 : widths[index])) + } + } + } + .clipShape(Capsule()) + } + .accessibilityHidden(true) + } + + private func row(_ mode: LoopModeSpan.Mode) -> some View { + let duration = LoopHistoryMath.duration(of: mode, in: spans) + return HStack(spacing: LoopDesign.Space.s2) { + Circle().fill(Self.color(mode)).frame(width: 8, height: 8) + Text(Self.name(mode)) + .font(LoopDesign.Typeface.subhead) + .foregroundStyle(P.ink) + Text("· \(LoopFormat.duration(duration))") + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + Spacer() + Text(percentText(fraction(mode) * 100, decimals: 1)) + .font(LoopDesign.Typeface.statValueSmall) + .foregroundStyle(P.ink) + } + .accessibilityElement(children: .combine) + } +} + +struct LoopGapsList: View { + let spans: [LoopModeSpan] + + private var gaps: [LoopModeSpan] { + spans.filter { $0.mode != .closed }.sorted { $0.start > $1.start } + } + + var body: some View { + List { + if gaps.isEmpty { + Text(NSLocalizedString("No gaps: Loop ran closed loop all through this period.", comment: "Trends Gaps list when Loop was in closed loop for the whole period")) + .foregroundStyle(P.inkMuted) + } + ForEach(Array(gaps.enumerated()), id: \.offset) { _, gap in + HStack(alignment: .top, spacing: LoopDesign.Space.s3) { + Circle().fill(LoopModeBarView.color(gap.mode)).frame(width: 8, height: 8).padding(.top, 6) + VStack(alignment: .leading, spacing: 2) { + Text(gap.cause ?? LoopModeBarView.name(gap.mode)) + .font(LoopDesign.Typeface.body) + Text("\(gap.start.formatted(.dateTime.weekday(.abbreviated).day().month(.abbreviated).hour().minute())) · \(LoopFormat.duration(gap.duration))") + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + } + } + .accessibilityElement(children: .combine) + } + } + .navigationTitle(NSLocalizedString("Gaps", comment: "Trends Loop status button and screen title: list of times Loop wasn't in closed loop")) + .navigationBarTitleDisplayMode(.inline) + } +} diff --git a/Loop/Redesign/TrendsScreen.swift b/Loop/Redesign/TrendsScreen.swift new file mode 100644 index 0000000000..0afaafdced --- /dev/null +++ b/Loop/Redesign/TrendsScreen.swift @@ -0,0 +1,614 @@ +// +// TrendsScreen.swift +// Loop +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import SwiftUI +import UIKit + +private typealias P = LoopDesign.Palette + +/// The period review: everything on the screen follows one RangeSelector period. +@MainActor +final class TrendsModel: ObservableObject { + + struct Summary { + var interval: DateInterval + var unit: GlucoseUnitStyle + /// CGM readings only: typed-in fingersticks are left out of every figure, as on Statistics. + var glucose: [GlucosePoint] = [] + /// Days from the first reading, when that is short of the period; nil when the readings span it. + var cgmCoveredDays: Int? + var stats: LoopHistoryMath.GlucoseStats? + var cgmActive: Double = 0 + var timeInRange: [LoopHistoryMath.RangeBand: Double] = [:] + var agp: [LoopHistoryMath.AGPSlot] = [] + var agpDays = 0 + var totals: [LoopHistoryMath.DayTotal] = [] + /// Carbs and bolus counts cover only the days per-day figures divide by (see `dataDays`). + var carbGrams = 0.0 + var carbEntries = 0 + var carbsByDay: [Date: Double] = [:] + var manualBoluses = 0 + var automaticBoluses = 0 + var loopSpans: [LoopModeSpan] = [] + var loopCoverageStart: Date? + var targetRange: ClosedRange? + /// The whole calendar day, for a one-day period: drawn as the same timeline as Now's Today so far. + var day: DayHistory? + var dayTargets: [TargetBand] = [] + /// What the basal schedule delivers over the same days the split averages. + var scheduledBasal: Double? + /// The median insulin by this time of day over the last 14 days, when the period ends now. + var typicalByNow: (typical: TypicalInsulinDelivery, at: Date)? + + /// The days per-day figures divide by: insulin's averaging days, or complete days with CGM data when there is + /// no insulin (today only when no complete day has any), never the period length. + var dataDays = 0 + var days: Double { Double(max(1, dataDays)) } + var basalUnits: Double { LoopHistoryMath.averagingDays(totals).reduce(0) { $0 + $1.basal } } + var bolusUnits: Double { LoopHistoryMath.averagingDays(totals).reduce(0) { $0 + $1.bolus } } + var insulinPerDay: Double { LoopHistoryMath.averageDailyInsulin(totals) } + var basalShare: Double { basalUnits + bolusUnits > 0 ? basalUnits / (basalUnits + bolusUnits) : 0 } + /// Per day over the averaged days; a single day in progress when that is all there is. + var split: InsulinSplit { InsulinSplit.average(LoopHistoryMath.averagingDays(totals).map(\.split)) } + /// The split is today's total so far rather than an average of complete days. + var splitIsPartial: Bool { LoopHistoryMath.averagingDays(totals).allSatisfy { !$0.isComplete } } + } + + @Published var period: TrendsPeriod = .twoWeeks + @Published var endDay = Date() + @Published private(set) var summary: Summary? + @Published private(set) var loading = false + @Published private(set) var loadError: String? + + let provider: LoopHistoryProvider + private var loadTask: Task? + + init(provider: LoopHistoryProvider) { + self.provider = provider + } + + var interval: DateInterval { period.interval(endingOn: endDay) } + + func reload() { + loadTask?.cancel() + let interval = self.interval + let oneDay = period == .day + loading = true + summary = nil + loadError = nil + loadTask = Task { + do { + let result = try await Self.load(provider: provider, interval: interval, oneDay: oneDay) + guard !Task.isCancelled else { return } + self.summary = result + } catch { + guard !Task.isCancelled else { return } + self.loadError = error.localizedDescription + } + self.loading = false + } + } + + private static func load(provider: LoopHistoryProvider, interval: DateInterval, oneDay: Bool) async throws -> Summary { + var summary = Summary(interval: interval, unit: provider.unitStyle) + summary.targetRange = provider.glucoseTargetRange + + // A single day is read to midnight, as Today so far is, so the scheduled basal still to come is drawn. + let fetchWindow = oneDay ? DateInterval(start: interval.start, end: Calendar.current.date(byAdding: .day, value: 1, to: interval.start)!) : interval + async let historyFetch = provider.dayHistory(fetchWindow, includeOnBoard: false) + async let runsFetch = provider.loopRuns() + var history = try await historyFetch + let (runs, coverageStart) = try await runsFetch + if oneDay { + summary.day = history + summary.dayTargets = try await provider.glucoseTargetBands(in: fetchWindow) + history = history.clipped(to: interval) + } + + let cgm = history.glucose.filter { !$0.userEntered } + summary.glucose = cgm + summary.stats = LoopHistoryMath.glucoseStats(cgm) + summary.cgmActive = LoopHistoryMath.cgmActiveFraction(cgm, over: interval) + summary.timeInRange = LoopHistoryMath.timeInRange(cgm) + summary.agp = LoopHistoryMath.agp(cgm) + summary.agpDays = LoopHistoryMath.daysWithReadings(cgm) + summary.cgmCoveredDays = LoopHistoryMath.cgmCoveredDays(cgm, in: interval, + periodDays: LoopHistoryMath.days(in: interval).count) + + let calendar = Calendar.current + summary.totals = LoopHistoryMath.days(in: interval).map { day in + let basal = history.basal.compactMap { $0.clamped(to: day) }.reduce(0) { $0 + $1.units } + let boluses = history.boluses.filter { $0.date >= day.start && $0.date < day.end } + return LoopHistoryMath.DayTotal(day: day.start, split: InsulinSplit(basal: basal, boluses: boluses), + isComplete: calendar.date(byAdding: .day, value: 1, to: day.start) == day.end) + } + let glucoseDays = Set(history.glucose.map { calendar.startOfDay(for: $0.date) }) + // Carbs and bolus counts share insulin's days, so a period with years of CGM data but a few days of Loop + // isn't spread thin. Without insulin, fall back to days with CGM data. + let withData = summary.totals.filter { $0.total > 0 || glucoseDays.contains($0.day) } + let insulinDays = LoopHistoryMath.averagingDays(summary.totals) + let averaged = !insulinDays.isEmpty ? insulinDays + : withData.contains(where: \.isComplete) ? withData.filter(\.isComplete) : withData + let averagedDays = Set(averaged.map(\.day)) + let inAveragedDays: (Date) -> Bool = { averagedDays.contains(calendar.startOfDay(for: $0)) } + summary.dataDays = averaged.count + summary.carbsByDay = Dictionary(grouping: history.carbs) { calendar.startOfDay(for: $0.date) } + .mapValues { $0.reduce(0) { $0 + $1.grams } } + let carbs = history.carbs.filter { inAveragedDays($0.date) } + summary.carbGrams = carbs.reduce(0) { $0 + $1.grams } + summary.carbEntries = carbs.count + let boluses = history.boluses.filter { inAveragedDays($0.date) } + summary.manualBoluses = boluses.filter { !$0.automatic }.count + summary.automaticBoluses = boluses.filter(\.automatic).count + + summary.loopCoverageStart = coverageStart + // Days the stored profile history doesn't reach (older ones, read from Health) use today's schedule. + let spans = Dictionary(uniqueKeysWithValues: LoopHistoryMath.days(in: interval).map { ($0.start, $0) }) + let perDay = provider.scheduledBasalPerDay + let scheduled = insulinDays.compactMap { day -> Double? in + guard let span = spans[day.day] else { return nil } + return LoopHistoryMath.scheduledUnits(history.scheduledBasal, over: span) ?? perDay.map { $0 * span.duration / 86400 } + } + if !scheduled.isEmpty, scheduled.count == insulinDays.count { + summary.scheduledBasal = scheduled.reduce(0, +) / Double(scheduled.count) + } + if interval.end.timeIntervalSinceNow > -300 { + summary.typicalByNow = await provider.typicalInsulinByNow() + } + + summary.loopSpans = LoopHistoryMath.loopModeSpans(interval: interval, runs: runs, modeChanges: LoopModeHistory.shared.changes, + coverageStart: coverageStart) + return summary + } + + // MARK: Tiles + + func tiles(_ s: Summary) -> [StatTile] { + let unit = s.unit + var tiles: [StatTile] = [] + let averageLabel = NSLocalizedString("Average", comment: "Trends summary tile: mean glucose over the period") + let gmiLabel = NSLocalizedString("GMI", comment: "Trends summary tile: abbreviation for Glucose Management Indicator, an estimate of HbA1c from CGM data") + let loopActiveLabel = NSLocalizedString("Loop active", comment: "Trends summary tile: share of the period Loop spent in closed loop") + if let stats = s.stats { + tiles.append(StatTile(label: averageLabel, value: unit.format(stats.meanMgdl), unit: unit.unitName, + detail: String(format: NSLocalizedString("SD %1$@ · CV %2$@%%", comment: "Trends Average tile detail: standard deviation and coefficient of variation of glucose. (1: standard deviation in the glucose unit, 2: coefficient of variation as a percentage number)"), + unit.format(stats.sdMgdl), LoopFormat.number(stats.cv * 100, decimals: 0)))) + let enough = s.cgmActive * s.interval.duration / 86400 >= 10 + tiles.append(StatTile(label: gmiLabel, value: LoopFormat.number(stats.gmiPercent, decimals: 1), unit: "%", + detail: enough + ? String(format: NSLocalizedString("%1$@ mmol/mol", comment: "Trends GMI tile detail: the GMI in IFCC units. (1: value)"), + LoopFormat.number(stats.gmiMmolMol, decimals: 0)) + : NSLocalizedString("Needs 10 days of CGM", comment: "Trends GMI tile detail when fewer than 10 days of CGM data are available"))) + } else { + tiles.append(StatTile(label: averageLabel, value: "–", unit: unit.unitName, + detail: NSLocalizedString("No CGM data", comment: "Trends Average tile detail when the period has no glucose readings"))) + tiles.append(StatTile(label: gmiLabel, value: "–", unit: "%", detail: nil)) + } + let basalPercent = LoopFormat.number(s.basalShare * 100, decimals: 0) + let insulinDetail: String + if let note = daysNote(s) { + insulinDetail = String(format: NSLocalizedString("%1$@%% basal · %2$@", comment: "Trends Insulin per day tile detail when only some days are averaged. (1: basal share as a percentage number, 2: days averaged, e.g. 5 of 14 days)"), + basalPercent, note) + } else { + insulinDetail = String(format: NSLocalizedString("%1$@%% basal", comment: "Trends Insulin per day tile detail: share of insulin delivered as basal. (1: percentage number)"), + basalPercent) + } + // One day's figures are that day's own, so its tiles drop "per day" and show whole counts. + let oneDay = s.day != nil + let countDecimals = oneDay ? 0 : 1 + tiles.append(StatTile(label: oneDay + ? NSLocalizedString("Insulin", comment: "Trends summary tile for a one-day period: the day's total insulin") + : NSLocalizedString("Insulin per day", comment: "Trends tile and card title: average total insulin per day"), + value: LoopFormat.number(s.insulinPerDay, decimals: 1), + unit: NSLocalizedString("U", comment: "Abbreviation for insulin units"), + detail: insulinDetail, valueColor: P.insulinInk)) + tiles.append(StatTile(label: oneDay + ? NSLocalizedString("Carbs", comment: "Trends summary tile for a one-day period: the day's total carbohydrate") + : NSLocalizedString("Carbs per day", comment: "Trends summary tile: average grams of carbohydrate entered per day"), + value: LoopFormat.number(s.carbGrams / s.days, decimals: 0), + unit: NSLocalizedString("g", comment: "Abbreviation for grams"), + detail: oneDay + ? String(format: NSLocalizedString("%lld entries", comment: "Trends Carbs tile detail for a one-day period: how many carb entries were made that day. (1: number)"), s.carbEntries) + : String(format: NSLocalizedString("%1$@ entries", comment: "Trends Carbs per day tile detail: average number of carb entries per day, a fractional value such as 2.5, so not pluralised. (1: number with one decimal)"), + LoopFormat.number(Double(s.carbEntries) / s.days, decimals: 1)), + valueColor: P.carbsInk)) + tiles.append(StatTile(label: oneDay + ? NSLocalizedString("Boluses", comment: "Trends summary tile for a one-day period: how many manual boluses were given that day") + : NSLocalizedString("Boluses per day", comment: "Trends summary tile: average number of manual boluses per day"), + value: LoopFormat.number(Double(s.manualBoluses) / s.days, decimals: countDecimals), unit: nil, + detail: String(format: NSLocalizedString("+ %1$@ automatic", comment: "Trends Boluses per day tile detail: average number of automatic boluses per day on top of the manual ones, a fractional value such as 4.2. (1: number with one decimal)"), + LoopFormat.number(Double(s.automaticBoluses) / s.days, decimals: countDecimals)))) + let covered = s.loopSpans.reduce(0) { $0 + $1.duration } + if covered > 0 { + let closed = LoopHistoryMath.duration(of: .closed, in: s.loopSpans) + tiles.append(StatTile(label: loopActiveLabel, value: LoopFormat.number(closed / covered * 100, decimals: 0), unit: "%", + detail: String(format: NSLocalizedString("%1$@ of %2$@", comment: "Trends Loop active tile detail: time in closed loop out of the time Loop status is known. (1: duration in closed loop, e.g. 6d 4h, 2: duration covered, e.g. 7d)"), + LoopFormat.duration(closed), LoopFormat.duration(covered)))) + } else { + tiles.append(StatTile(label: loopActiveLabel, value: "–", unit: "%", + detail: NSLocalizedString("No loop runs kept", comment: "Trends Loop active tile detail when no Loop run history is available for the period"))) + } + return tiles + } + + /// "5 of 14 days" when only part of the period is averaged: days without data, or today while it runs. + private func daysNote(_ s: Summary) -> String? { + let insulinDays = LoopHistoryMath.averagingDays(s.totals).count + guard insulinDays < s.totals.count else { return nil } + let total = String.localizedStringWithFormat(NSLocalizedString("%lld days", comment: "A number of days, e.g. a Trends period or how many days are averaged. (1: number of days)"), s.totals.count) + return String(format: NSLocalizedString("%1$@ of %2$@", comment: "Trends: how many days of the period are averaged. (1: days averaged, a number; 2: days in the period, e.g. 14 days)"), LoopFormat.number(Double(insulinDays), decimals: 0), total) + } + + // MARK: Export + + static func exportCSV(_ s: Summary) throws -> URL { + // The CSV header and values are deliberately not localised: fixed English columns and '.' decimals for data interchange. + var lines = ["date,mean_glucose_\(s.unit.isMmol ? "mmol_l" : "mg_dl"),readings,time_in_range_pct,basal_u,bolus_u,total_u,carbs_g,manual_bolus_u,auto_bolus_u"] + let calendar = Calendar.current + let byDay = Dictionary(grouping: s.glucose) { calendar.startOfDay(for: $0.date) } + for total in s.totals { + let readings = byDay[total.day] ?? [] + let mean = readings.isEmpty ? "" : String(format: "%.*f", locale: Locale(identifier: "en_US_POSIX"), + s.unit.isMmol ? 1 : 0, s.unit.value(readings.reduce(0) { $0 + $1.mgdl } / Double(readings.count))) + let tir = readings.isEmpty ? "" : String(format: "%.0f", (LoopHistoryMath.timeInRange(readings)[.inRange] ?? 0) * 100) + let date = Date.ISO8601FormatStyle(timeZone: .current).year().month().day().format(total.day) + let carbs = String(format: "%.0f", s.carbsByDay[total.day] ?? 0) + // Left blank when some of the day's bolus doesn't say whether it was manual or automatic. + let bolusSplit = total.split.isClassified ? String(format: "%.2f,%.2f", total.split.manualBolus, total.split.automaticBolus) : "," + lines.append("\(date),\(mean),\(readings.count),\(tir),\(String(format: "%.2f,%.2f,%.2f", total.basal, total.bolus, total.total)),\(carbs),\(bolusSplit)") + } + let url = FileManager.default.temporaryDirectory.appendingPathComponent(Self.fileName(s.interval) + ".csv") + try lines.joined(separator: "\n").write(to: url, atomically: true, encoding: .utf8) + return url + } + + func exportPDF(_ s: Summary) throws -> URL { + let url = FileManager.default.temporaryDirectory.appendingPathComponent(Self.fileName(s.interval) + ".pdf") + let report = TrendsReport(summary: s, tiles: tiles(s)) + .frame(width: 560) + .environment(\.colorScheme, .light) + let renderer = ImageRenderer(content: report) + renderer.proposedSize = ProposedViewSize(width: 560, height: nil) + var thrown: Error? + renderer.render { size, draw in + var box = CGRect(x: 0, y: 0, width: 612, height: max(792, size.height + 52)) + guard let consumer = CGDataConsumer(url: url as CFURL), let context = CGContext(consumer: consumer, mediaBox: &box, nil) else { + thrown = CocoaError(.fileWriteUnknown) + return + } + context.beginPDFPage(nil) + context.translateBy(x: 26, y: box.height - size.height - 26) + draw(context) + context.endPDFPage() + context.closePDF() + } + if let thrown { throw thrown } + return url + } + + private static func fileName(_ interval: DateInterval) -> String { + String(format: NSLocalizedString("Loop trends %1$@", comment: "File name of an exported Trends report or CSV, without the extension. (1: date range of the period)"), + fileStamp(interval)) + } + + private static func fileStamp(_ interval: DateInterval) -> String { + LoopFormat.range(interval.start, interval.end.addingTimeInterval(-1)).replacingOccurrences(of: " – ", with: " to ") + } +} + +// MARK: - Screen + +struct TrendsView: View { + @StateObject private var model: TrendsModel + @State private var path: [TrendsRoute] = [] + @State private var exportURL: URL? + @State private var exportError: String? + + enum TrendsRoute: Hashable { + case day(Date) + case gaps + } + + init(provider: LoopHistoryProvider) { + _model = StateObject(wrappedValue: TrendsModel(provider: provider)) + } + + var body: some View { + NavigationStack(path: $path) { + ScrollView { + LazyVStack(alignment: .leading, spacing: LoopDesign.Space.s6, pinnedViews: [.sectionHeaders]) { + Section { + content + } header: { + RangeSelectorView(period: $model.period, endDay: $model.endDay) + .padding(.vertical, LoopDesign.Space.s2) + .background(P.surface) + } + } + .padding(.horizontal, LoopDesign.Space.s4) + .padding(.bottom, LoopDesign.Space.s6) + } + .background(P.surface) + .navigationTitle(NSLocalizedString("Trends", comment: "Title of the Trends tab")) + .refreshable { model.reload() } + .navigationDestination(for: TrendsRoute.self) { route in + switch route { + case .day(let day): + DayDetailView(provider: model.provider, day: day) + case .gaps: + LoopGapsList(spans: model.summary?.loopSpans ?? []) + } + } + } + .onAppear { model.reload() } + .onChange(of: model.period) { _, _ in model.reload() } + .onChange(of: model.endDay) { _, _ in model.reload() } + .sheet(item: $exportURL) { url in + ShareSheet(items: [url]) + } + .alert(NSLocalizedString("Couldn't export", comment: "Alert title when exporting the Trends PDF or CSV fails"), + isPresented: Binding(get: { exportError != nil }, set: { if !$0 { exportError = nil } })) { + Button(NSLocalizedString("OK", comment: "Button to dismiss an alert"), role: .cancel) {} + } message: { + Text(exportError ?? "") + } + } + + @ViewBuilder + private var content: some View { + if let s = model.summary { + summaryCard(s) + // A single day leads with its timeline, as Today so far does on Now. + if let day = s.day { + dayCard(day, targets: s.dayTargets, unit: s.unit) + } + LoopCard { + CardHeader(title: NSLocalizedString("Time in range", comment: "Trends card title: share of glucose readings in each range")) { + Text(String(format: NSLocalizedString("%1$@%% CGM active", comment: "Trends Time in range card: share of the period with CGM readings. (1: percentage number)"), + LoopFormat.number(s.cgmActive * 100, decimals: 0))) + } + if s.glucose.isEmpty { + ChartPlaceholder(message: NSLocalizedString("No CGM data in this period", comment: "Trends chart placeholder when the period has no glucose readings")) + } else { + TimeInRangeView(fractions: s.timeInRange, unit: s.unit) + } + Footnote(String(format: NSLocalizedString("Aim: over 70%% in range; under 25%% above and 4%% below; under 5%% very high and 1%% very low; CGM active over 70%%.", comment: "Trends Time in range card footnote: the consensus targets for time in range, above and below range, very high, very low and CGM wear"))) + } + if s.day == nil { + patternCard(s) + } + LoopCard { + CardHeader(title: NSLocalizedString("Basal and bolus", comment: "Trends card title: insulin split into basal and bolus")) { + Text(s.splitIsPartial + ? NSLocalizedString("today so far", comment: "Trends Basal and bolus card subtitle when the figures are today's total so far") + : s.totals.count == 1 + ? NSLocalizedString("this day", comment: "Trends Basal and bolus card subtitle when the period is one complete day") + : NSLocalizedString("average per day", comment: "Trends Basal and bolus card subtitle when the figures are averaged per day over the period")) + } + if s.split.total > 0 { + InsulinSplitView(split: s.split, partial: s.splitIsPartial, scheduledBasal: s.scheduledBasal, + usual: s.splitIsPartial ? usualByNow(s) : nil) + } else { + ChartPlaceholder(message: NSLocalizedString("No insulin recorded in this period", comment: "Trends Insulin per day chart placeholder when no insulin was delivered in the period"), height: 80) + } + } + // One day is one bar: the timeline and the Basal and bolus card already say it all. + if s.day == nil { + LoopCard { + CardHeader(title: NSLocalizedString("Insulin per day", comment: "Trends tile and card title: average total insulin per day")) { + Text(s.totals.count > 30 + ? NSLocalizedString("per day, weekly average", comment: "Trends Insulin per day card subtitle when each bar is a week's average daily total") + : NSLocalizedString("basal and bolus", comment: "Trends Insulin per day card subtitle when each bar is one day's basal and bolus")) + } + InsulinDailyTotalsView(totals: s.totals.count > 30 ? LoopHistoryMath.weekly(s.totals) : s.totals, + weekly: s.totals.count > 30, average: s.insulinPerDay) { day in + path.append(.day(day)) + } + ChartLegend(items: insulinLegend(s)) + if let today = todaySoFar(s) { + Footnote(today) + } + } + } + LoopCard { + CardHeader(title: NSLocalizedString("Loop status", comment: "Trends card title: how long Loop spent in closed loop, limited or open loop")) { + Button(NSLocalizedString("Gaps", comment: "Trends Loop status button and screen title: list of times Loop wasn't in closed loop")) { path.append(.gaps) } + .foregroundStyle(P.accentInk) + .disabled(s.loopSpans.isEmpty) + } + LoopModeBarView(spans: s.loopSpans) + if let note = coverageNote(s) { + Footnote(note) + } + } + } else if let error = model.loadError { + LoopCard { + ChartPlaceholder(message: String(format: NSLocalizedString("Couldn't load Trends: %1$@", comment: "Trends error message when the history can't be read. (1: error description)"), error)) + Button(NSLocalizedString("Retry", comment: "Button to try loading Trends again after an error")) { model.reload() }.foregroundStyle(P.accentInk) + } + } else { + ProgressView().frame(maxWidth: .infinity, minHeight: 300) + } + } + + /// The same timeline as Today so far: glucose, every bolus and basal change, and carbs, through the day. + private func dayCard(_ day: DayHistory, targets: [TargetBand], unit: GlucoseUnitStyle) -> some View { + let isToday = Calendar.current.isDateInToday(day.window.start) + return Button { + path.append(.day(day.window.start)) + } label: { + DayTimelineCard(title: isToday ? DayTimelineCard.todayTitle : LoopFormat.weekdayDay(day.window.start), + history: day, unit: unit, targetBands: targets, height: 260, showsTotals: false) + } + .buttonStyle(.plain) + .accessibilityHint(NSLocalizedString("Opens the full day", comment: "VoiceOver hint for the Today so far card on the Now screen")) + } + + private func patternCard(_ s: TrendsModel.Summary) -> some View { + LoopCard { + CardHeader(title: NSLocalizedString("Daily pattern", comment: "Trends card title: the ambulatory glucose profile, glucose by time of day across the period")) { Text(s.unit.unitName) } + TrendsAGPChart(slots: s.agp, readings: s.glucose, days: s.agpDays, unit: s.unit, targetRange: s.targetRange) + ChartLegend(items: [ + LegendItem(swatch: .solid(P.glucose), label: NSLocalizedString("Median", comment: "Trends Daily pattern legend: the median glucose line")), + LegendItem(swatch: .solid(P.agpInner), label: NSLocalizedString("25–75%", comment: "Trends Daily pattern legend: band between the 25th and 75th percentiles of glucose")), + LegendItem(swatch: .solid(P.agpOuter), label: NSLocalizedString("5–95%", comment: "Trends Daily pattern legend: band between the 5th and 95th percentiles of glucose")), + ]) + } + } + + private func summaryCard(_ s: TrendsModel.Summary) -> some View { + LoopCard { + CardHeader(title: NSLocalizedString("Summary", comment: "Trends card title: the summary statistics tiles")) { + Menu(NSLocalizedString("Export", comment: "Trends menu title: export the period as a PDF report or CSV file")) { + Button(NSLocalizedString("PDF report", comment: "Trends export menu item: share a PDF report of the period")) { export { try model.exportPDF(s) } } + Button(NSLocalizedString("CSV, one row per day", comment: "Trends export menu item: share a CSV spreadsheet file with one row for each day")) { export { try TrendsModel.exportCSV(s) } } + } + .foregroundStyle(P.accentInk) + } + if let covered = s.cgmCoveredDays { + Footnote(String(format: NSLocalizedString("CGM data covers %1$@.", comment: "Trends Summary note when glucose readings start partway through the period. (1: days covered, e.g. 5 of 14 days)"), + daysOf(covered, s.totals.count))) + } + StatGridView(tiles: model.tiles(s)) + .opacity(model.loading ? 0.5 : 1) + if s.stats != nil { + Footnote(String(format: NSLocalizedString("Aim: average under %1$@ %2$@, GMI under 7%%, CV 36%% or less.", comment: "Trends Summary footnote: the consensus targets for average glucose, GMI and glucose variability (CV). (1: glucose value, 2: glucose unit)"), + s.unit.isMmol ? LoopFormat.number(8.6, decimals: 1) : "154", s.unit.unitName)) + } + } + } + + /// "5 of 14 days". + private func daysOf(_ count: Int, _ total: Int) -> String { + let days = String.localizedStringWithFormat(NSLocalizedString("%lld days", comment: "A number of days, e.g. a Trends period or how many days are averaged. (1: number of days)"), total) + return String(format: NSLocalizedString("%1$@ of %2$@", comment: "Trends: how many days of the period are averaged. (1: days averaged, a number; 2: days in the period, e.g. 14 days)"), LoopFormat.number(Double(count), decimals: 0), days) + } + + /// "Usually 28.4 U by 19:46": today's insulin against the last 14 days at the same time. + private func usualByNow(_ s: TrendsModel.Summary) -> String? { + guard let usual = s.typicalByNow else { return nil } + return String(format: NSLocalizedString("Usually %1$@ by %2$@", comment: "Trends: the median insulin delivered by this time of day over the last 14 days. (1: units, e.g. 28.4 U, 2: time of day)"), + LoopFormat.totalUnits(usual.typical.median), LoopFormat.time(usual.at)) + } + + /// Today's bar is still growing, so say where it stands against a usual day. + private func todaySoFar(_ s: TrendsModel.Summary) -> String? { + guard let today = s.totals.last, !today.isComplete, today.total > 0, let usual = s.typicalByNow else { return nil } + return String(format: NSLocalizedString("Today so far %1$@, usually %2$@ by %3$@.", comment: "Trends Insulin per day footnote: today's insulin so far against the median by this time of day over the last 14 days. (1: today's units, 2: usual units, 3: time of day)"), + LoopFormat.totalUnits(today.total), LoopFormat.totalUnits(usual.typical.median), LoopFormat.time(usual.at)) + } + + private func export(_ make: () throws -> URL) { + do { + exportURL = try make() + } catch { + exportError = error.localizedDescription + } + } + + /// The figures are on the Basal and bolus card above, so the legend only names the marks. + private func insulinLegend(_ s: TrendsModel.Summary) -> [LegendItem] { + [ + LegendItem(swatch: .basal, label: NSLocalizedString("Basal", comment: "Chart legend: the basal part of each day's insulin")), + LegendItem(swatch: .solid(P.bolus), label: NSLocalizedString("Bolus", comment: "Chart legend: solid bars are manual boluses")), + LegendItem(swatch: .hatch(P.bolus), label: NSLocalizedString("Automatic", comment: "Chart legend: hatched bars are automatic boluses given by Loop")), + LegendItem(swatch: .dash(P.ink), + label: String(format: NSLocalizedString("Average %1$@ U", comment: "Trends Insulin per day legend: the dashed line showing average total insulin per day. (1: units)"), + LoopFormat.number(s.insulinPerDay, decimals: 1))), + ] + } + + private func coverageNote(_ s: TrendsModel.Summary) -> String? { + guard let start = s.loopSpans.first?.start else { + return NSLocalizedString("Loop status is recorded from when the new interface was first opened.", comment: "Trends Loop status footnote when there is no Loop status history yet") + } + guard start > s.interval.start else { return nil } + return String(format: NSLocalizedString("Covers %1$@: Loop keeps 7 days of runs, and closed or open loop is recorded from when the new interface was first opened.", comment: "Trends Loop status footnote when the status covers only part of the period. (1: date range covered)"), + LoopFormat.range(start, s.interval.end)) + } +} + +extension URL: @retroactive Identifiable { + public var id: String { absoluteString } +} + +struct ShareSheet: UIViewControllerRepresentable { + let items: [Any] + + func makeUIViewController(context: Context) -> UIActivityViewController { + UIActivityViewController(activityItems: items, applicationActivities: nil) + } + + func updateUIViewController(_ controller: UIActivityViewController, context: Context) {} +} + +/// A card's quiet closing line: a target, a caveat or a comparison. +private struct Footnote: View { + let text: String + + init(_ text: String) { + self.text = text + } + + var body: some View { + Text(text) + .font(LoopDesign.Typeface.footnote) + .foregroundStyle(P.inkMuted) + .fixedSize(horizontal: false, vertical: true) + } +} + +// MARK: - PDF report + +/// The Trends cards laid out for paper. +private struct TrendsReport: View { + let summary: TrendsModel.Summary + let tiles: [StatTile] + + var body: some View { + VStack(alignment: .leading, spacing: LoopDesign.Space.s4) { + VStack(alignment: .leading, spacing: 2) { + Text(NSLocalizedString("Loop trends", comment: "Title of the exported Trends PDF report")).font(.title2.bold()) + Text(LoopFormat.range(summary.interval.start, summary.interval.end.addingTimeInterval(-1))) + .font(.subheadline) + .foregroundStyle(P.inkMuted) + } + StatGridView(tiles: tiles) + HStack(alignment: .top, spacing: LoopDesign.Space.s4) { + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + Text(NSLocalizedString("Time in range", comment: "Trends card title: share of glucose readings in each range")).font(.headline) + TimeInRangeView(fractions: summary.timeInRange, unit: summary.unit) + } + .frame(maxWidth: .infinity) + } + if let day = summary.day { + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + Text(LoopFormat.weekdayDay(day.window.start)).font(.headline) + InsulinTimelineView(history: day, unit: summary.unit, targetBands: summary.dayTargets, height: 220) + ChartLegend(items: DayTotalsTiles.legend) + } + } else { + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + Text(NSLocalizedString("Daily pattern", comment: "Trends card title: the ambulatory glucose profile, glucose by time of day across the period")).font(.headline) + TrendsAGPChart(slots: summary.agp, readings: summary.glucose, days: summary.agpDays, unit: summary.unit, + targetRange: summary.targetRange, height: 160) + } + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + Text(NSLocalizedString("Insulin per day", comment: "Trends tile and card title: average total insulin per day")).font(.headline) + InsulinDailyTotalsView(totals: summary.totals.count > 30 ? LoopHistoryMath.weekly(summary.totals) : summary.totals, + weekly: summary.totals.count > 30, average: summary.insulinPerDay, height: 140) + } + } + VStack(alignment: .leading, spacing: LoopDesign.Space.s2) { + Text(NSLocalizedString("Loop status", comment: "Trends card title: how long Loop spent in closed loop, limited or open loop")).font(.headline) + LoopModeBarView(spans: summary.loopSpans) + } + } + .padding(LoopDesign.Space.s2) + .background(Color.white) + } +} diff --git a/Loop/View Controllers/StatusTableViewController.swift b/Loop/View Controllers/StatusTableViewController.swift index 70d95eebd3..bb2f167c7f 100644 --- a/Loop/View Controllers/StatusTableViewController.swift +++ b/Loop/View Controllers/StatusTableViewController.swift @@ -95,6 +95,7 @@ final class StatusTableViewController: LoopChartsTableViewController { tableView.register(BolusProgressTableViewCell.nib(), forCellReuseIdentifier: BolusProgressTableViewCell.className) tableView.register(InsulinSuspendedTableViewCell.nib(), forCellReuseIdentifier: InsulinSuspendedTableViewCell.className) tableView.register(RecentGlucoseTableViewCell.nib(), forCellReuseIdentifier: RecentGlucoseTableViewCell.className) + tableView.register(UITableViewCell.self, forCellReuseIdentifier: Self.nowHostingCellIdentifier) applyDisplayPreferences() @@ -229,6 +230,11 @@ final class StatusTableViewController: LoopChartsTableViewController { addScenarioStepGestureRecognizers() setupPresetsStatusBar() + + if usesRedesign { + tableView.backgroundColor = .systemGroupedBackground + tableView.separatorStyle = .none + } } override func didReceiveMemoryWarning() { @@ -361,6 +367,32 @@ final class StatusTableViewController: LoopChartsTableViewController { private var bolusProgressReporter: DoseProgressReporter? + // MARK: - Redesign + + /// Read once, so a table never mixes the two layouts; LoopAppManager rebuilds the screen when the preference changes. + let usesRedesign = LoopInterfacePreference.useRedesign + + private static let nowHostingCellIdentifier = "NowHostingCell" + + private lazy var nowModel: NowModel = { + let model = NowModel(deviceManager: deviceManager, loopDataManager: loopManager, settingsManager: settingsManager, temporaryPresetsManager: temporaryPresetsManager) + model.isOnboardingComplete = { [weak self] in self?.onboardingManager.isComplete ?? false } + return model + }() + + private lazy var nowActions = NowActions( + addCarbs: { [weak self] in self?.userTappedAddCarbs() }, + bolus: { [weak self] in self?.presentBolusScreen() }, + presets: { [weak self] in self?.presentPresets() }, + showPrediction: { [weak self] in self?.showPredictionFromNow() }, + showToday: { [weak self] in self?.showDay(Date()) }, + showInsulin: { [weak self] in self?.showInsulinDelivery(sender: self) }, + showCarbs: { [weak self] in self?.performSegue(withIdentifier: CarbAbsorptionViewController.className, sender: self) }, + pumpTapped: { [weak self] in self?.executeHUDTapAction(self?.deviceManager.didTapOnPumpStatus(), from: self?.view) }, + cgmTapped: { [weak self] in self?.executeHUDTapAction(self?.deviceManager.didTapOnCGMStatus(), from: self?.view) }, + loopStatusTapped: { [weak self] in self?.showLoopStatusFromNow() } + ) + private func updateBolusProgress() { if let cell = tableView.cellForRow(at: IndexPath(row: StatusRow.status.rawValue, section: Section.status.rawValue)) as? BolusProgressTableViewCell { if case let .bolusing(_, total) = cell.configuration { @@ -403,7 +435,7 @@ final class StatusTableViewController: LoopChartsTableViewController { } private var shouldShowHUD: Bool { - return !landscapeMode + return !landscapeMode && !usesRedesign } // With a vertical status bar there is no top safe area inset, so keep the first row clear of the display corners. @@ -413,7 +445,7 @@ final class StatusTableViewController: LoopChartsTableViewController { } private var shouldShowStatus: Bool { - return !landscapeMode && statusRowMode.hasRow + return (!landscapeMode || usesRedesign) && statusRowMode.hasRow } override func glucoseUnitDidChange() { @@ -700,10 +732,14 @@ final class StatusTableViewController: LoopChartsTableViewController { let statusRowMode = self.determineStatusRowMode() updateBannerAndHUDandStatusRows(statusRowMode: statusRowMode, newSize: currentContext.newSize, animated: animated) - tableView.contentInset = UIEdgeInsets(top: shouldShowBannerWarning ? 0 : cornerClearanceTopInset, left: 0, bottom: ActionTabBarMetrics.tableContentInset, right: 0) + tableView.contentInset = UIEdgeInsets(top: shouldShowBannerWarning ? 0 : cornerClearanceTopInset, left: 0, bottom: usesRedesign ? 0 : ActionTabBarMetrics.tableContentInset, right: 0) redrawCharts() + if usesRedesign { + nowModel.refresh() + } + reloading = false let reloadNow = !self.refreshContext.isEmpty @@ -718,8 +754,10 @@ final class StatusTableViewController: LoopChartsTableViewController { case presets case alertWarning case hud + case nowHeader case status case charts + case nowCharts } // MARK: - Chart Section Data @@ -980,9 +1018,11 @@ final class StatusTableViewController: LoopChartsTableViewController { case .hud: return shouldShowHUD ? 1 : 0 case .charts: - return ChartRow.allCases.count + return usesRedesign ? 0 : ChartRow.allCases.count case .status: return shouldShowStatus ? StatusRow.allCases.count : 0 + case .nowHeader, .nowCharts: + return usesRedesign ? 1 : 0 } } @@ -1068,6 +1108,10 @@ final class StatusTableViewController: LoopChartsTableViewController { cell.hudView.loopCompletionHUD.loopStatusColors = .loopStatus return cell + case .nowHeader: + return nowHostingCell(for: indexPath) { NowHeaderView(model: self.nowModel, actions: self.nowActions) } + case .nowCharts: + return nowHostingCell(for: indexPath) { NowChartsView(model: self.nowModel, actions: self.nowActions) } case .charts: let cell = tableView.dequeueReusableCell(withIdentifier: ChartTableViewCell.className, for: indexPath) as! ChartTableViewCell @@ -1274,7 +1318,7 @@ final class StatusTableViewController: LoopChartsTableViewController { cell.setSubtitleLabel(label: nil) } } - case .presets, .hud, .status, .alertWarning: + case .presets, .hud, .status, .alertWarning, .nowHeader, .nowCharts: break } } @@ -1299,7 +1343,7 @@ final class StatusTableViewController: LoopChartsTableViewController { } case .alertWarning: return UITableView.automaticDimension - case .presets, .hud, .status: + case .presets, .hud, .status, .nowHeader, .nowCharts: return UITableView.automaticDimension } } @@ -1316,7 +1360,7 @@ final class StatusTableViewController: LoopChartsTableViewController { tableView.deselectRow(at: indexPath, animated: true) presentUnmuteAlertConfirmation() } - case .hud: + case .hud, .nowHeader, .nowCharts: break case .status: switch StatusRow(rawValue: indexPath.row)! { @@ -1390,70 +1434,7 @@ final class StatusTableViewController: LoopChartsTableViewController { performSegue(withIdentifier: PredictionTableViewController.className, sender: indexPath) } case .iob: - let showLegacy = false - - if !showLegacy, let pumpManager = deviceManager.pumpManager { - let hostingController = UIHostingController( - rootView: InsulinDeliveryLog( - viewModel: InsulinDeliveryLogViewModel( - loopDataManager: loopManager, - pumpManager: pumpManager - ), - onTapGesture: { [weak navigationController] doseEntry in - Task { - var dosingDecision: StoredDosingDecision? - if let decisionId = doseEntry.decisionId { - do { - dosingDecision = try await self.loopManager.dosingDecisionStore.findDosingDecisionsById(decisionId) - } catch { - self.log.error("Error finding dosing decision: %{public}@", String(describing: error)) - } - } - - let viewController = CommandResponseViewController(command: { (completionHandler) -> String in - var description = [String]() - - let timeFormatter: DateFormatter = { - let formatter = DateFormatter() - - formatter.dateStyle = .none - formatter.timeStyle = .short - - return formatter - }() - - description.append(timeFormatter.string(from: doseEntry.startDate)) - - description.append(String(describing: doseEntry)) - - if let dosingDecision { - description.append(String(describing: dosingDecision)) - } - - return description.joined(separator: "\n\n") - }) - - navigationController?.pushViewController(viewController, animated: true) - } - }, - onEnterManualDose: { [weak self] in - self?.presentManualDoseEntry() - } - ) - .navigationTitle(Text("Insulin")) - .environment(\.colorPalette, .default) - .environment(\.loopStatusColorPalette, .loopStatus) - ) - - hostingController.hidesBottomBarWhenPushed = true - - navigationController?.pushViewController( - hostingController, - animated: true - ) - } else { - performSegue(withIdentifier: InsulinDeliveryTableViewController.className, sender: indexPath) - } + showInsulinDelivery(sender: indexPath) case .cob: performSegue(withIdentifier: CarbAbsorptionViewController.className, sender: indexPath) } @@ -1606,9 +1587,14 @@ final class StatusTableViewController: LoopChartsTableViewController { if let activity { viewModel.restoreUserActivityState(activity) } - let carbEntryView = CarbEntryView(viewModel: viewModel) - .environmentObject(deviceManager.displayGlucosePreference) - let hostingController = DismissibleHostingController(rootView: carbEntryView, isModalInPresentation: false) + let hostingController: UIViewController + if LoopInterfacePreference.useRedesign { + hostingController = DismissibleHostingController(rootView: CarbEntryScreen(viewModel: viewModel) + .environmentObject(deviceManager.displayGlucosePreference), isModalInPresentation: false) + } else { + hostingController = DismissibleHostingController(rootView: CarbEntryView(viewModel: viewModel) + .environmentObject(deviceManager.displayGlucosePreference), isModalInPresentation: false) + } present(hostingController, animated: true) } analyticsServicesManager?.didDisplayCarbEntryScreen() @@ -1808,6 +1794,74 @@ final class StatusTableViewController: LoopChartsTableViewController { } } + /// The insulin screen behind the IOB chart and the Now screen's IOB tile. + private func showInsulinDelivery(sender: Any?) { + let showLegacy = false + + if !showLegacy, let pumpManager = deviceManager.pumpManager { + let hostingController = UIHostingController( + rootView: InsulinDeliveryLog( + viewModel: InsulinDeliveryLogViewModel( + loopDataManager: loopManager, + pumpManager: pumpManager + ), + onTapGesture: { [weak navigationController] doseEntry in + Task { + var dosingDecision: StoredDosingDecision? + if let decisionId = doseEntry.decisionId { + do { + dosingDecision = try await self.loopManager.dosingDecisionStore.findDosingDecisionsById(decisionId) + } catch { + self.log.error("Error finding dosing decision: %{public}@", String(describing: error)) + } + } + + let viewController = CommandResponseViewController(command: { (completionHandler) -> String in + var description = [String]() + + let timeFormatter: DateFormatter = { + let formatter = DateFormatter() + + formatter.dateStyle = .none + formatter.timeStyle = .short + + return formatter + }() + + description.append(timeFormatter.string(from: doseEntry.startDate)) + + description.append(String(describing: doseEntry)) + + if let dosingDecision { + description.append(String(describing: dosingDecision)) + } + + return description.joined(separator: "\n\n") + }) + + navigationController?.pushViewController(viewController, animated: true) + } + }, + onEnterManualDose: { [weak self] in + self?.presentManualDoseEntry() + } + ) + .navigationTitle(Text("Insulin")) + .environment(\.colorPalette, .default) + .environment(\.loopStatusColorPalette, .loopStatus) + ) + + hostingController.hidesBottomBarWhenPushed = true + + navigationController?.pushViewController( + hostingController, + animated: true + ) + } else { + performSegue(withIdentifier: InsulinDeliveryTableViewController.className, sender: sender) + } + } + private func addPumpManagerViewToHUD(_ view: BaseHUDView) { if let hudView = hudView { view.stateColors = .pumpStatus @@ -1844,7 +1898,7 @@ final class StatusTableViewController: LoopChartsTableViewController { let error: Error? // First, check whether we have a device error after the most recent completion date if let deviceError = deviceManager.lastError, - deviceError.date > (hudView?.loopCompletionHUD.lastLoopCompleted ?? .distantPast) + deviceError.date > (loopManager.lastLoopCompleted ?? .distantPast) { error = deviceError.error } else if let lastLoopError = lastLoopError { @@ -2383,3 +2437,47 @@ private struct WarningBannerStyle: ViewModifier { } } } + +// MARK: - Redesigned Now screen + +extension StatusTableViewController { + private func nowHostingCell(for indexPath: IndexPath, @ViewBuilder content: () -> Content) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: Self.nowHostingCellIdentifier, for: indexPath) + cell.selectionStyle = .none + cell.backgroundColor = .clear + cell.contentConfiguration = UIHostingConfiguration(content: content).margins(.all, 0) + return cell + } + + func presentSettingsFromTab() { + if presentedViewController != nil { + return + } + presentSettings() + } + + private func showPredictionFromNow() { + guard settingsManager.dosingEnabled || !FeatureFlags.simpleBolusCalculatorEnabled else { return } + performSegue(withIdentifier: PredictionTableViewController.className, sender: self) + } + + func showDay(_ day: Date) { + let detail = UIHostingController(rootView: DayDetailView(provider: nowModel.provider, day: day)) + // As for the Insulin, Carbohydrates and Predicted Glucose screens pushed from Now. + detail.hidesBottomBarWhenPushed = true + navigationController?.pushViewController(detail, animated: true) + } + + private func showLoopStatusFromNow() { + let lastCompleted = loopManager.lastLoopCompleted + if let deviceError = deviceManager.lastError, deviceError.date > (lastCompleted ?? .distantPast) { + showLastError(self) + } else if lastLoopError != nil { + showLastError(self) + } else { + // The classic HUD keeps this current; the new interface has no HUD, so set it before presenting. + loopCompletionModalViewModel.ago = lastCompleted.map { Date().timeIntervalSince($0) } + showLoopCompletionMessage(self) + } + } +} diff --git a/Loop/View Models/CarbEntryViewModel.swift b/Loop/View Models/CarbEntryViewModel.swift index 719a2daa22..7e93335ee7 100644 --- a/Loop/View Models/CarbEntryViewModel.swift +++ b/Loop/View Models/CarbEntryViewModel.swift @@ -263,8 +263,9 @@ final class CarbEntryViewModel: ObservableObject { } private func observeFavoriteFoodIndexChange() { + // Selection is already on the main actor. Apply it before a caller sets a replacement + // amount or absorption time; a queued reset would otherwise overwrite that choice. $selectedFavoriteFoodIndex - .receive(on: RunLoop.main) .dropFirst() .sink { [weak self] index in self?.favoriteFoodSelected(at: index) diff --git a/Loop/Views/SettingsView.swift b/Loop/Views/SettingsView.swift index 70f6d26b4e..5cbdb9953e 100644 --- a/Loop/Views/SettingsView.swift +++ b/Loop/Views/SettingsView.swift @@ -85,6 +85,7 @@ struct SettingsView: View { } alertManagementSection statisticsSection + interfaceSection if viewModel.pumpManagerSettingsViewModel.isSetUp() { therapySection } @@ -341,22 +342,25 @@ extension SettingsView { private var statisticsSection: some View { if let glucoseStore = viewModel.deviceManager?.glucoseStore { Section { - NavigationLink(destination: StatisticsView( - glucoseStore: glucoseStore, - insulinDeliveryHistory: viewModel.insulinDeliveryHistory, - scheduledBasalTotal: viewModel.therapySettings().basalRateSchedule?.total() - )) { - LargeButton( - action: {}, - includeArrow: false, - imageView: Image(systemName: "chart.xyaxis.line") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 30), - label: NSLocalizedString("Statistics", comment: "Statistics settings button text"), - descriptiveText: NSLocalizedString("Glucose overview, ambulatory glucose profile and daily insulin", comment: "Statistics settings descriptive text") - ) - .accessibilityIdentifier("settingsViewStatistics") + // The new interface's Trends tab covers these statistics. + if !LoopInterfacePreference.useRedesign { + NavigationLink(destination: StatisticsView( + glucoseStore: glucoseStore, + insulinDeliveryHistory: viewModel.insulinDeliveryHistory, + scheduledBasalTotal: viewModel.therapySettings().basalRateSchedule?.total() + )) { + LargeButton( + action: {}, + includeArrow: false, + imageView: Image(systemName: "chart.xyaxis.line") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 30), + label: NSLocalizedString("Statistics", comment: "Statistics settings button text"), + descriptiveText: NSLocalizedString("Glucose overview, ambulatory glucose profile and daily insulin", comment: "Statistics settings descriptive text") + ) + .accessibilityIdentifier("settingsViewStatistics") + } } NavigationLink(destination: CurrentSetupView(viewModel: CurrentSetupViewModel( selected: setupChange, @@ -453,6 +457,21 @@ extension SettingsView { .environment(\.insulinTintColor, self.insulinTintColor) } + @ViewBuilder + private var interfaceSection: some View { + Section(footer: Text(NSLocalizedString("The new interface adds Trends and Logbook tabs. Turn it off to go back to the classic status screen; Settings closes to switch.", comment: "Footer for the interface choice in settings"))) { + Toggle(NSLocalizedString("New Interface", comment: "Title of the toggle for the redesigned interface"), isOn: Binding( + get: { LoopInterfacePreference.useRedesign }, + set: { LoopInterfacePreference.useRedesign = $0 } + )) + } + Section { + NavigationLink(destination: AppearanceSettingsView()) { + Text(NSLocalizedString("Appearance and App Icon", comment: "Title of the row that opens the appearance and app icon settings")) + } + } + } + private var therapySection: some View { Section { NavigationLink(destination: therapySettingsView) { diff --git a/Loop/Views/StatusTableView.swift b/Loop/Views/StatusTableView.swift index be4012a8f2..c3c1af2469 100644 --- a/Loop/Views/StatusTableView.swift +++ b/Loop/Views/StatusTableView.swift @@ -98,7 +98,10 @@ struct StatusTableView: View { var wrappedView: some View { wrapped } @Bindable var viewModel: StatusTableViewModel - + + /// The redesign puts these actions on the Now screen and its own tab bar. + private var actionTabsShown = true + init(viewModel: StatusTableViewModel) { self.viewModel = viewModel @@ -124,20 +127,39 @@ struct StatusTableView: View { ) } + func showsActionTabs(_ shown: Bool) -> StatusTableView { + var view = self + view.actionTabsShown = shown + return view + } + + private var statusContent: some View { + wrappedView + .ignoresSafeArea(edges: [.horizontal, .bottom]) + .onChange(of: viewModel.temporaryPresetsManager.activeOverride) { _, _ in + Task { + await viewController.reloadData(animated: true) + } + } + .sheet(item: $viewModel.pendingPreset) { preset in + // This is the active preset; edit disabled + PresetDetentView(preset: preset, roundBasalRate: viewModel.loopDataManager.deliveryDelegate?.roundBasalRate, didTapEdit: { }) + .accessibilityIdentifier("bar_Presets") + } + } + + @ViewBuilder var body: some View { + if actionTabsShown { + actionTabView + } else { + statusContent + } + } + + private var actionTabView: some View { ActionTabView { - wrappedView - .ignoresSafeArea(edges: [.horizontal, .bottom]) - .onChange(of: viewModel.temporaryPresetsManager.activeOverride) { _, _ in - Task { - await viewController.reloadData(animated: true) - } - } - .sheet(item: $viewModel.pendingPreset) { preset in - // This is the active preset; edit disabled - PresetDetentView(preset: preset, roundBasalRate: viewModel.loopDataManager.deliveryDelegate?.roundBasalRate, didTapEdit: { }) - .accessibilityIdentifier("bar_Presets") - } + statusContent } tabs: { ActionTab( title: "Add Carbs", diff --git a/LoopCore/NSUserDefaults.swift b/LoopCore/NSUserDefaults.swift index 8ed715f823..64982c38d4 100644 --- a/LoopCore/NSUserDefaults.swift +++ b/LoopCore/NSUserDefaults.swift @@ -24,6 +24,7 @@ extension UserDefaults { case userRequestedLoopReset = "com.loopkit.Loop.userRequestedLoopReset" case liveActivity = "com.loopkit.Loop.liveActivity" case defaultEnvironment = "org.tidepool.TidepoolKit.DefaultEnvironment" + case redesignEnabled = "com.loopkit.Loop.redesign.enabled" } public static let appGroup = UserDefaults(suiteName: Bundle.main.appGroupSuiteName) @@ -155,6 +156,13 @@ extension UserDefaults { } } + /// Whether the redesigned interface is on. The app mirrors its setting into the app group so the + /// widget and Live Activity can match it; they default to the redesign, as the app does. + public var redesignEnabled: Bool { + get { object(forKey: Key.redesignEnabled.rawValue) as? Bool ?? true } + set { set(newValue, forKey: Key.redesignEnabled.rawValue) } + } + public var liveActivity: LiveActivitySettings? { get { let decoder = JSONDecoder() diff --git a/LoopTests/Managers/LoopDataManagerTests.swift b/LoopTests/Managers/LoopDataManagerTests.swift index 13bc5b470b..0b369795e0 100644 --- a/LoopTests/Managers/LoopDataManagerTests.swift +++ b/LoopTests/Managers/LoopDataManagerTests.swift @@ -462,6 +462,90 @@ class LoopDataManagerTests: XCTestCase { } + func testFavoriteSelectionCannotOverwriteAReplacementMeal() async throws { + let viewModel = CarbEntryViewModel(delegate: loopDataManager) + let savedFoods = viewModel.favoriteFoods + defer { viewModel.favoriteFoods = savedFoods } + viewModel.favoriteFoods = [StoredFavoriteFood(name: "Meal", carbsQuantity: LoopQuantity(unit: .gram, doubleValue: 35), + foodType: "🌮", absorptionTime: .hours(3))] + viewModel.selectedFavoriteFoodIndex = 0 + let selected = expectation(description: "Favourite selection settled") + RunLoop.main.perform { selected.fulfill() } + await fulfillment(of: [selected], timeout: 2) + XCTAssertEqual(viewModel.carbsQuantity, 35) + + // The person replaces the favourite with a fast meal, retaining its amount. + let quantity = viewModel.carbsQuantity + viewModel.selectedFavoriteFoodIndex = -1 + viewModel.carbsQuantity = quantity + viewModel.usesCustomFoodType = false + viewModel.selectedDefaultAbsorptionTimeEmoji = "🍭" + viewModel.absorptionTime = .minutes(30) + let settled = expectation(description: "Replacement meal settled") + RunLoop.main.perform { settled.fulfill() } + await fulfillment(of: [settled], timeout: 2) + + XCTAssertEqual(viewModel.carbsQuantity, 35) + XCTAssertEqual(viewModel.absorptionTime, .minutes(30)) + XCTAssertFalse(viewModel.continueButtonDisabled) + } + + func testHistoricalTargetsUseStoredProfilesAndEndedPresets() async throws { + func target(_ low: Double, _ high: Double) -> ClosedRange { + LoopQuantity(unit: .milligramsPerDeciliter, doubleValue: low)...LoopQuantity(unit: .milligramsPerDeciliter, doubleValue: high) + } + let window = DateInterval(start: d(-.hours(3)), end: d(-.minutes(30))) + settingsProvider.targetRangeHistory = [ + AbsoluteScheduleValue(startDate: window.start, endDate: d(-.hours(2)), value: target(100, 110)), + AbsoluteScheduleValue(startDate: d(-.hours(2)), endDate: window.end, value: target(120, 130)), + ] + var preset = TemporaryScheduleOverride(context: .custom, + settings: TemporaryPresetSettings(targetRange: target(150, 160), insulinNeedsScaleFactor: 1), + startDate: d(-.minutes(150)), duration: .finite(.hours(2)), + enactTrigger: .local, syncIdentifier: UUID()) + preset.actualEnd = .early(d(-.minutes(90))) + temporaryPresetsManager.presetHistory.recordOverride(preset, at: d(-.minutes(150))) + + let bands = try await loopDataManager.glucoseTargetBands(in: window) + XCTAssertEqual(bands, [ + TargetBand(start: window.start, end: d(-.minutes(150)), range: 100...110), + TargetBand(start: d(-.minutes(150)), end: d(-.minutes(90)), range: 150...160), + TargetBand(start: d(-.minutes(90)), end: window.end, range: 120...130), + ]) + } + + func testTargetBandsAreUnknownBeforeTherapyIsConfigured() async throws { + settingsProvider.settings.glucoseTargetRangeSchedule = nil + let bands = try await loopDataManager.glucoseTargetBands(in: DateInterval(start: d(-.hours(3)), end: now)) + XCTAssertTrue(bands.isEmpty) + } + + func testHistoricalIOBUsesPresetAdjustedBasal() async throws { + settingsProvider.basalHistory = [AbsoluteScheduleValue(startDate: d(-.hours(6)), endDate: now, value: 1.0)] + let window = DateInterval(start: d(-.minutes(30)), end: now) + + for multiplier in [0.5, 1.5] { + let preset = TemporaryScheduleOverride( + context: .custom, + settings: TemporaryPresetSettings(targetRange: nil, insulinNeedsScaleFactor: multiplier), + startDate: d(-.hours(1)), + duration: .finite(.hours(2)), + enactTrigger: .local, + syncIdentifier: UUID() + ) + temporaryPresetsManager.presetHistory.recordOverride(preset, at: now) + doseStore.doseHistory = [DoseEntry(type: .tempBasal, startDate: window.start, endDate: window.end, + value: multiplier, unit: .unitsPerHour, decisionId: nil)] + + let timeline = try await loopDataManager.insulinOnBoardTimeline(in: window) + XCTAssertFalse(timeline.isEmpty) + for value in timeline { + XCTAssertEqual(value.value, 0, accuracy: 1e-9, + "Delivery matching a \(multiplier)× preset's basal must add no net IOB") + } + } + } + func testFetchDataWithHighInsulinNeedsPresetMitigation() async throws { var input = try await loopDataManager.fetchData(for: now) XCTAssertEqual(input.target.count, 1) diff --git a/LoopTests/Models/LoopHistoryMathTests.swift b/LoopTests/Models/LoopHistoryMathTests.swift new file mode 100644 index 0000000000..4c4628ca36 --- /dev/null +++ b/LoopTests/Models/LoopHistoryMathTests.swift @@ -0,0 +1,385 @@ +// +// LoopHistoryMathTests.swift +// LoopTests +// +// Copyright © 2026 LoopKit Authors. All rights reserved. +// + +import XCTest +import HealthKit +import LoopKit +@testable import Loop + +class LoopHistoryMathTests: XCTestCase { + + private let start = Date(timeIntervalSinceReferenceDate: 800_000_000) + private func at(_ minutes: Double) -> Date { start.addingTimeInterval(minutes * 60) } + + // MARK: Basal + + func testUnrecordedBasalCountsAtTheProgrammedRateOnlyAfterRecordsBegin() { + let window = DateInterval(start: at(0), end: at(240)) + let programmed = [LoopHistoryMath.ScheduleValue(start: at(0), end: at(240), rate: 1.2)] + let temp = LoopHistoryMath.BasalDelivery(start: at(120), end: at(150), rate: 0.4, kind: .temp, automatic: true) + let segments = LoopHistoryMath.basalSegments(window: window, schedule: programmed, deliveries: [temp], + programmedRates: programmed, recordsStart: at(60)) + // Nothing before the first record; 60–120 and 150–240 at 1.2 U/h; 120–150 at the temp rate. + XCTAssertNil(LoopHistoryMath.basalRate(at: at(30), in: segments)) + XCTAssertEqual(LoopHistoryMath.basalRate(at: at(90), in: segments)?.kind, .scheduled) + XCTAssertEqual(LoopHistoryMath.basalRate(at: at(135), in: segments)?.rate, 0.4) + XCTAssertEqual(segments.reduce(0) { $0 + $1.units }, 1.2 * 2.5 + 0.4 * 0.5, accuracy: 1e-9) + } + + func testBasalGapsDoNotInventDelivery() { + let window = DateInterval(start: at(0), end: at(120)) + let schedule = [LoopHistoryMath.ScheduleValue(start: at(-60), end: at(240), rate: 1.0)] + let temp = LoopHistoryMath.BasalDelivery(start: at(60), end: at(90), rate: 2.0, kind: .temp, automatic: true) + let segments = LoopHistoryMath.basalSegments(window: window, schedule: schedule, deliveries: [temp]) + XCTAssertEqual(segments.count, 1) + XCTAssertEqual(segments.reduce(0) { $0 + $1.units }, 1, accuracy: 1e-9) + XCTAssertEqual(segments[0].netUnits, 0.5, accuracy: 1e-9) + } + + func testSuspendDeliversNothingAndLaterRecordWins() { + let window = DateInterval(start: at(0), end: at(60)) + let schedule = [LoopHistoryMath.ScheduleValue(start: at(0), end: at(60), rate: 1.2)] + let deliveries = [ + LoopHistoryMath.BasalDelivery(start: at(0), end: at(60), rate: 3.0, kind: .temp, automatic: true), + LoopHistoryMath.BasalDelivery(start: at(20), end: at(40), rate: 0, kind: .suspended, automatic: false), + ] + let segments = LoopHistoryMath.basalSegments(window: window, schedule: schedule, deliveries: deliveries) + XCTAssertEqual(segments.map(\.kind), [.temp, .suspended, .temp]) + XCTAssertEqual(segments[1].units, 0) + XCTAssertEqual(segments[1].netUnits, -0.4, accuracy: 1e-9) + } + + func testNormalisedBasalPreservesDeliveredQuantityInPartialWindow() throws { + // The pump reports 1.05 U delivered, although the programmed rate implies 1.0625 U. + let dose = DoseEntry(type: .tempBasal, startDate: at(0), endDate: at(30), value: 2.125, + unit: .unitsPerHour, decisionId: nil, deliveredUnits: 1.05, automatic: true) + let delivery = try XCTUnwrap(LoopHistoryMath.BasalDelivery(dose: dose)) + for (end, expected) in [(30.0, 1.05), (15.0, 0.525)] { + let segments = LoopHistoryMath.basalSegments(window: DateInterval(start: at(0), end: at(end)), + schedule: [], deliveries: [delivery]) + XCTAssertEqual(segments.reduce(0) { $0 + $1.units }, expected, accuracy: 1e-9) + } + } + + func testHealthAndLocalPartitionsConserveBasalDelivery() throws { + let sample = HKQuantitySample(type: HKQuantityType(.insulinDelivery), + quantity: HKQuantity(unit: .internationalUnit(), doubleValue: 1), + start: at(0), end: at(60), + metadata: [HKMetadataKeyInsulinDeliveryReason: HKInsulinDeliveryReason.basal.rawValue]) + let left = try XCTUnwrap(BasalSegment(healthSample: sample, in: DateInterval(start: at(-30), end: at(30)))) + let right = try XCTUnwrap(BasalSegment(healthSample: sample, in: DateInterval(start: at(30), end: at(90)))) + XCTAssertEqual(left.units, 0.5, accuracy: 1e-9) + XCTAssertEqual(right.units, 0.5, accuracy: 1e-9, "Include basal beginning before the selected interval") + let dose = DoseEntry(type: .basal, startDate: at(0), endDate: at(60), value: 1, unit: .units, decisionId: nil, deliveredUnits: 1) + let local = LoopHistoryMath.basalSegments(window: DateInterval(start: at(30), end: at(90)), schedule: [], + deliveries: [try XCTUnwrap(LoopHistoryMath.BasalDelivery(dose: dose))]) + XCTAssertEqual(left.units + local.reduce(0) { $0 + $1.units }, 1, accuracy: 1e-9) + XCTAssertNil(BasalSegment(healthSample: sample, in: DateInterval(start: at(60), end: at(90)))) + + } + + func testBolusWindowIsHalfOpenAndPreservesDeliveredUnits() { + let window = DateInterval(start: at(0), end: at(60)) + for (minute, expected) in [(-1.0, false), (0.0, true), (30.0, true), (60.0, false)] { + let dose = DoseEntry(type: .bolus, startDate: at(minute), value: 1, unit: .units, decisionId: nil, deliveredUnits: 0.75) + let event = BolusEvent(dose: dose, in: window) + XCTAssertEqual(event != nil, expected, "Bolus at minute \(minute)") + if expected { XCTAssertEqual(event?.units, 0.75) } + } + } + + // MARK: Glucose + + func testTimeInRangeBandsAndRoundingSumTo100() { + let values: [Double] = [50, 60, 100, 100, 100, 200, 300] + let points = values.enumerated().map { GlucosePoint(date: at(Double($0.offset * 5)), mgdl: $0.element) } + let fractions = LoopHistoryMath.timeInRange(points) + XCTAssertEqual(fractions[.veryLow]!, 1 / 7, accuracy: 1e-9) + XCTAssertEqual(fractions[.low]!, 1 / 7, accuracy: 1e-9) + XCTAssertEqual(fractions[.inRange]!, 3 / 7, accuracy: 1e-9) + XCTAssertEqual(fractions[.high]!, 1 / 7, accuracy: 1e-9) + XCTAssertEqual(fractions[.veryHigh]!, 1 / 7, accuracy: 1e-9) + XCTAssertEqual(LoopHistoryMath.roundedPercentages(fractions).values.reduce(0, +), 100) + } + + func testBandEdgesFollowConsensusThresholds() { + XCTAssertEqual(LoopHistoryMath.RangeBand.band(for: 53.9), .veryLow) + XCTAssertEqual(LoopHistoryMath.RangeBand.band(for: 54), .low) + XCTAssertEqual(LoopHistoryMath.RangeBand.band(for: 70), .inRange) + XCTAssertEqual(LoopHistoryMath.RangeBand.band(for: 180), .inRange) + XCTAssertEqual(LoopHistoryMath.RangeBand.band(for: 181), .high) + XCTAssertEqual(LoopHistoryMath.RangeBand.band(for: 251), .veryHigh) + } + + func testGMIFromMean() { + let points = [GlucosePoint(date: at(0), mgdl: 150), GlucosePoint(date: at(5), mgdl: 150)] + let stats = LoopHistoryMath.glucoseStats(points)! + XCTAssertEqual(stats.gmiPercent, 3.31 + 0.02392 * 150, accuracy: 1e-9) + XCTAssertEqual(stats.gmiMmolMol, (stats.gmiPercent - 2.152) * 10.929, accuracy: 1e-9) + XCTAssertNil(LoopHistoryMath.glucoseStats([points[0]])) + } + + func testCGMCoverageNotedOnlyWhenReadingsStartLate() { + let interval = DateInterval(start: at(0), end: at(14 * 1440)) + let late = [GlucosePoint(date: at(9 * 1440), mgdl: 120), GlucosePoint(date: at(10 * 1440), mgdl: 130)] + XCTAssertEqual(LoopHistoryMath.cgmCoveredDays(late, in: interval, periodDays: 14), 5) + // Within a day of the full period, or a one-day period, says nothing. + XCTAssertNil(LoopHistoryMath.cgmCoveredDays([GlucosePoint(date: at(600), mgdl: 120)], in: interval, periodDays: 14)) + XCTAssertNil(LoopHistoryMath.cgmCoveredDays(late, in: DateInterval(start: at(0), end: at(1440)), periodDays: 1)) + XCTAssertNil(LoopHistoryMath.cgmCoveredDays([], in: interval, periodDays: 14)) + } + + func testScheduledUnitsNeedTheWholeSpanCovered() { + let points = [ScheduledBasalPoint(start: at(0), end: at(120), rate: 1.0), ScheduledBasalPoint(start: at(120), end: at(240), rate: 0.5)] + XCTAssertEqual(try XCTUnwrap(LoopHistoryMath.scheduledUnits(points, over: DateInterval(start: at(60), end: at(180)))), 1.5, accuracy: 1e-9) + XCTAssertNil(LoopHistoryMath.scheduledUnits(points, over: DateInterval(start: at(60), end: at(360)))) + } + + func testPercentileInterpolates() { + XCTAssertEqual(LoopHistoryMath.percentile([1, 2, 3, 4, 5], 0.5), 3) + XCTAssertEqual(LoopHistoryMath.percentile([1, 2, 3, 4], 0.5), 2.5) + XCTAssertEqual(LoopHistoryMath.percentile([10, 20], 0.25), 12.5) + } + + // MARK: Loop modes + + func testLoopModesStartAtFirstModeRecord() { + let interval = DateInterval(start: at(0), end: at(60)) + let runs = stride(from: 0.0, through: 60, by: 5).map { LoopHistoryMath.LoopRun(date: at($0), succeeded: true, error: nil) } + let spans = LoopHistoryMath.loopModeSpans(interval: interval, runs: runs, + modeChanges: [.init(date: at(30), closedLoop: true)], coverageStart: at(0)) + XCTAssertEqual(spans.first?.start, at(30), "Before the first record the mode is unknown and left out") + XCTAssertEqual(LoopHistoryMath.duration(of: .closed, in: spans), 30 * 60, accuracy: 1) + + XCTAssertTrue(LoopHistoryMath.loopModeSpans(interval: interval, runs: runs, modeChanges: [], coverageStart: at(0)).isEmpty) + } + + func testLoopModesClassifyOpenAndLimited() { + let interval = DateInterval(start: at(0), end: at(90)) + // Runs succeed until 20 min, then fail with an error, then stop. + var runs = stride(from: 0.0, through: 20, by: 5).map { LoopHistoryMath.LoopRun(date: at($0), succeeded: true, error: nil) } + runs.append(.init(date: at(25), succeeded: false, error: "Glucose too old")) + let changes: [LoopHistoryMath.ModeChange] = [.init(date: at(0), closedLoop: true), .init(date: at(60), closedLoop: false)] + + let spans = LoopHistoryMath.loopModeSpans(interval: interval, runs: runs, modeChanges: changes, coverageStart: at(0)) + XCTAssertEqual(spans.map(\.mode), [.closed, .limited, .open]) + XCTAssertEqual(spans[1].cause, "Glucose too old") + XCTAssertEqual(spans[1].start, at(35), "Limited starts once the last good run is over 15 minutes old") + XCTAssertEqual(spans[2].start, at(55), "The slot ending at the switch-off counts as open") + } + + // MARK: Calendar + + func testDaysAndQuarterMarksOnClockChangeDay() throws { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = try XCTUnwrap(TimeZone(identifier: "Europe/London")) + // 25 Oct 2026: clocks go back an hour, so the day is 25 hours long. + let day = try XCTUnwrap(calendar.date(from: DateComponents(year: 2026, month: 10, day: 25))) + let next = try XCTUnwrap(calendar.date(byAdding: .day, value: 1, to: day)) + XCTAssertEqual(next.timeIntervalSince(day), 25 * 3600) + + let marks = DayAxis.quarterDayMarks(in: DateInterval(start: day, end: next), calendar: calendar) + XCTAssertEqual(marks.map { calendar.component(.hour, from: $0) }, [0, 6, 12, 18, 0]) + + let days = LoopHistoryMath.days(in: DateInterval(start: day, end: next.addingTimeInterval(3600)), calendar: calendar) + XCTAssertEqual(days.count, 2) + XCTAssertEqual(days[0].duration, 25 * 3600) + } + + func testWeeklyAveragesDays() { + let monday = Date(timeIntervalSinceReferenceDate: 815_270_400) // 9436 days after Monday 1 Jan 2001, so a Monday at midnight UTC + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = TimeZone(identifier: "UTC")! + let totals = (0..<14).map { LoopHistoryMath.DayTotal(day: monday.addingTimeInterval(Double($0) * 86400), basal: 10, bolus: Double($0)) } + let weeks = LoopHistoryMath.weekly(totals, calendar: calendar) + XCTAssertEqual(weeks.count, 2) + XCTAssertEqual(weeks[0].bolus, 3, accuracy: 1e-9) + XCTAssertEqual(weeks[1].bolus, 10, accuracy: 1e-9) + } + + func testDailyInsulinAverageLeavesOutTheDayInProgress() { + let day0 = Date(timeIntervalSinceReferenceDate: 815_270_400) + let complete = (0..<3).map { LoopHistoryMath.DayTotal(day: day0.addingTimeInterval(Double($0) * 86400), basal: 10, bolus: 20) } + let today = LoopHistoryMath.DayTotal(day: day0.addingTimeInterval(3 * 86400), basal: 3, bolus: 2, isComplete: false) + XCTAssertEqual(LoopHistoryMath.averageDailyInsulin(complete + [today]), 30, accuracy: 1e-9) + XCTAssertEqual(LoopHistoryMath.averagingDays(complete + [today]).count, 3) + // With nothing complete, the day in progress is all there is to show. + XCTAssertEqual(LoopHistoryMath.averageDailyInsulin([today]), 5, accuracy: 1e-9) + } + + func testInsulinSplitSeparatesManualAutomaticAndUnclassifiedBolus() { + let boluses = [ + BolusEvent(id: "m", date: at(0), units: 4, automatic: false, manuallyEntered: false), + BolusEvent(id: "a", date: at(5), units: 0.5, automatic: true, manuallyEntered: false), + BolusEvent(id: "u", date: at(10), units: 1, automatic: false, manuallyEntered: false, automaticKnown: false), + ] + let split = InsulinSplit(basal: 14.5, boluses: Array(boluses.prefix(2))) + XCTAssertEqual(split.manualBolus, 4, accuracy: 1e-9) + XCTAssertEqual(split.automaticBolus, 0.5, accuracy: 1e-9) + XCTAssertEqual(split.total, 19, accuracy: 1e-9) + XCTAssertTrue(split.isClassified) + // Shares round independently but always add up to 100. + XCTAssertEqual(split.basalPercent + split.bolusPercent, 100) + XCTAssertEqual(split.bolusPercent, 24) + + // A bolus that doesn't say who gave it still counts, but hides the manual and automatic detail. + let health = InsulinSplit(basal: 14.5, boluses: boluses) + XCTAssertEqual(health.bolus, 5.5, accuracy: 1e-9) + XCTAssertFalse(health.isClassified) + + let average = InsulinSplit.average([split, InsulinSplit(basal: 10.5, manualBolus: 2, automaticBolus: 1.5)]) + XCTAssertEqual(average.basal, 12.5, accuracy: 1e-9) + XCTAssertEqual(average.manualBolus, 3, accuracy: 1e-9) + XCTAssertEqual(average.automaticBolus, 1, accuracy: 1e-9) + } + + func testWeeklyInsulinUsesTheSummaryAveragingDays() { + let monday = Date(timeIntervalSinceReferenceDate: 815_270_400) + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = TimeZone(identifier: "UTC")! + let totals = [ + LoopHistoryMath.DayTotal(day: monday, basal: 0, bolus: 0), + LoopHistoryMath.DayTotal(day: monday.addingTimeInterval(86400), basal: 10, bolus: 20), + LoopHistoryMath.DayTotal(day: monday.addingTimeInterval(2 * 86400), basal: 10, bolus: 20), + LoopHistoryMath.DayTotal(day: monday.addingTimeInterval(3 * 86400), basal: 1, bolus: 2, isComplete: false), + ] + let weeks = LoopHistoryMath.weekly(totals, calendar: calendar) + XCTAssertEqual(weeks.count, 1) + XCTAssertEqual(weeks[0].basal, 10, accuracy: 1e-9) + XCTAssertEqual(weeks[0].bolus, 20, accuracy: 1e-9) + + // A current week with no complete day must still show the data it has. + let currentWeek = LoopHistoryMath.weekly([totals[3]], calendar: calendar) + XCTAssertEqual(currentWeek.first?.total, 3) + } + + func testGapMessageForADayWithoutReadings() { + let start = Date(timeIntervalSinceReferenceDate: 815_270_400) + let day = DateInterval(start: start, duration: 86400) + let empty = DayAxis.gaps(in: [], window: day, until: day.end.addingTimeInterval(3600)) + XCTAssertEqual(DayAxis.gapMessage(empty, window: day, until: day.end.addingTimeInterval(3600)), "No CGM data on this day") + let morning = start.addingTimeInterval(9 * 3600) + XCTAssertEqual(DayAxis.gapMessage(DayAxis.gaps(in: [], window: day, until: morning), window: day, until: morning), "No CGM data yet today") + let reading = [GlucosePoint(date: start.addingTimeInterval(12 * 3600), mgdl: 120)] + let partial = DayAxis.gaps(in: reading, window: day, until: day.end) + XCTAssertTrue(DayAxis.gapMessage(partial, window: day, until: day.end)?.hasSuffix("and 1 shorter gap") ?? false) + } + + // MARK: Formatting + + func testRangeFormatting() throws { + let calendar = Calendar.current + let a = try XCTUnwrap(calendar.date(from: DateComponents(year: 2026, month: 10, day: 12, hour: 12))) + let b = try XCTUnwrap(calendar.date(from: DateComponents(year: 2026, month: 10, day: 25, hour: 12))) + let c = try XCTUnwrap(calendar.date(from: DateComponents(year: 2026, month: 9, day: 28, hour: 12))) + // Ranges and durations come from the system's formatters, so they follow the user's locale; + // the test host runs in en_US. + XCTAssertEqual(LoopFormat.range(b, b), LoopFormat.day(b)) + let sameMonth = LoopFormat.range(a, b) + XCTAssertTrue(sameMonth.contains("12") && sameMonth.contains("25")) + XCTAssertEqual(sameMonth.components(separatedBy: "2026").count, 2, "the year appears once") + let twoMonths = LoopFormat.range(c, b) + XCTAssertTrue(twoMonths.contains("Sep") && twoMonths.contains("Oct")) + XCTAssertEqual(LoopFormat.duration(13 * 86400 + 11 * 3600), "13d 11h") + XCTAssertEqual(LoopFormat.duration(9 * 3600 + 45 * 60), "9h 45m") + XCTAssertEqual(LoopFormat.number(7.25, decimals: 1), 7.25.formatted(.number.precision(.fractionLength(1)).grouping(.never))) + XCTAssertEqual(LoopFormat.signed(-0.4), "−0.40") + XCTAssertEqual(LoopFormat.signed(0.0001), "+0.00") + } + + @MainActor + func testCSVExportsTenColumnsWithASCIINumbers() throws { + let day = Calendar.current.startOfDay(for: start) + let nextDay = day.addingTimeInterval(86400) + for isMmol in [true, false] { + var summary = TrendsModel.Summary(interval: DateInterval(start: day, duration: 2 * 86400), + unit: GlucoseUnitStyle(isMmol: isMmol)) + summary.glucose = [GlucosePoint(date: day, mgdl: 131.53286)] + summary.totals = [ + .init(day: day, split: InsulinSplit(basal: 1.25, manualBolus: 2, automaticBolus: 0.5)), + // From another app in Health: the bolus doesn't say whether it was manual or automatic. + .init(day: nextDay, split: InsulinSplit(basal: 1, unclassifiedBolus: 3)), + ] + summary.carbsByDay = [day: 45] + let url = try TrendsModel.exportCSV(summary) + defer { try? FileManager.default.removeItem(at: url) } + let rows = try String(contentsOf: url, encoding: .utf8).components(separatedBy: "\n") + XCTAssertEqual(rows.count, 3) + XCTAssertEqual(rows[0].components(separatedBy: ",").count, 10) + XCTAssertTrue(rows[0].hasSuffix(",carbs_g,manual_bolus_u,auto_bolus_u")) + let columns = rows[1].components(separatedBy: ",") + XCTAssertEqual(columns.count, 10) + XCTAssertEqual(Array(columns.dropFirst()), [isMmol ? "7.3" : "132", "1", "100", "1.25", "2.50", "3.75", "45", "2.00", "0.50"]) + XCTAssertEqual(Array(rows[2].components(separatedBy: ",").suffix(5)), ["3.00", "4.00", "0", "", ""]) + } + } + + func testModeHistoryRetainsTheModeBeforeTheRetentionWindow() throws { + let suite = "LoopHistoryMathTests-\(UUID().uuidString)" + let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) + defer { defaults.removePersistentDomain(forName: suite) } + let history = LoopModeHistory(defaults: defaults) + history.record(closedLoop: false, at: at(0)) + history.record(closedLoop: true, at: at(60)) + let switchDate = at(200 * 1440) + history.record(closedLoop: false, at: switchDate) + XCTAssertEqual(history.changes, [.init(date: at(60), closedLoop: true), .init(date: switchDate, closedLoop: false)]) + let interval = DateInterval(start: switchDate.addingTimeInterval(-3600), end: switchDate) + let spans = LoopHistoryMath.loopModeSpans(interval: interval, runs: [], modeChanges: history.changes, + coverageStart: interval.start) + XCTAssertEqual(spans.first?.start, interval.start, "Retaining the old mode must preserve recent coverage") + } + + func testIssueDescriptions() { + XCTAssertEqual(LoopHistoryProvider.describe(issue: "glucoseTooOld"), "Glucose too old") + XCTAssertEqual(LoopHistoryProvider.describe(issue: "pumpDataTooOld"), "Pump data too old") + } + + // MARK: Day history and Logbook folding + + func testDayHistoryClippedToNowDropsLaterEventsAndCutsBasal() { + var history = DayHistory(window: DateInterval(start: at(0), end: at(1440))) + history.glucose = [GlucosePoint(date: at(10), mgdl: 100), GlucosePoint(date: at(700), mgdl: 120)] + history.boluses = [BolusEvent(id: "a", date: at(30), units: 1, automatic: false, manuallyEntered: false), + BolusEvent(id: "b", date: at(650), units: 2, automatic: true, manuallyEntered: false)] + history.basal = [BasalSegment(start: at(0), end: at(720), rate: 1, scheduledRate: 1, kind: .scheduled, automatic: false)] + let clipped = history.clipped(to: DateInterval(start: at(0), end: at(600))) + XCTAssertEqual(clipped.window.end, at(600)) + XCTAssertEqual(clipped.glucose.count, 1) + XCTAssertEqual(clipped.boluses.map(\.id), ["a"]) + XCTAssertEqual(clipped.basalUnits, 10, accuracy: 1e-9) + } + + private func logRow(_ id: String, _ minutes: Double, automaticUnits: Double? = nil, basalSummary: Bool = false) -> LogEntry { + LogEntry(id: id, date: at(minutes), title: id, subtitle: "", amount: "", amountColor: .primary, detail: "", + icon: "plus", iconStyle: .solid(.primary), filters: [], + basalChanges: basalSummary ? [BasalSegment(start: at(0), end: at(30), rate: 0, scheduledRate: 1, kind: .temp, automatic: true)] : [], + automaticUnits: automaticUnits) + } + + @MainActor + func testLogbookFoldsRunsOfAutomaticBolusesBetweenOtherEntries() { + // Newest first, as the Logbook lists them. + let rows = [ + logRow("auto5", 100, automaticUnits: 0.3), + logRow("auto4", 95, automaticUnits: 0.2), + logRow("basal", 90, basalSummary: true), + logRow("auto3", 85, automaticUnits: 0.1), + logRow("carbs", 60), + logRow("auto2", 30, automaticUnits: 0.5), + logRow("manual", 20), + logRow("auto1", 10, automaticUnits: 0.1), + ] + let folded = LogbookModel.foldingAutomaticBoluses(rows) + // auto5, auto4 and auto3 fold together: the basal summary doesn't break a run, the carbs do. + XCTAssertEqual(folded.map(\.id), ["autorun-auto5", "basal", "carbs", "auto2", "manual", "auto1"]) + XCTAssertEqual(folded[0].bolusRun.map(\.id), ["auto5", "auto4", "auto3"]) + XCTAssertEqual(folded[0].date, at(100)) + XCTAssertTrue(folded[0].matches(.loop) && folded[0].matches(.bolus)) + XCTAssertEqual(folded[0].amount, LoopFormat.doseUnits(0.6)) + } +}