diff --git a/lib/I18n/translations/belarusian.yaml b/lib/I18n/translations/belarusian.yaml index 4e48dd80..66660085 100644 --- a/lib/I18n/translations/belarusian.yaml +++ b/lib/I18n/translations/belarusian.yaml @@ -143,7 +143,6 @@ STR_ALIGN_LEFT: "Па левым краі" STR_CENTER: "Па цэнтры" STR_ALIGN_RIGHT: "Па правым краі" STR_MIN_1: "1 хв" -STR_MIN_3: "3 хв" STR_MIN_5: "5 хв" STR_MIN_10: "10 хв" STR_MIN_15: "15 хв" @@ -296,6 +295,9 @@ STR_DISPLAY_QR: "Паказаць старонку як QR" STR_FOOTNOTES: "Зноскі" STR_NO_FOOTNOTES: "На гэтай старонцы няма зносак" STR_LINK: "[спасылка]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u хв" +STR_SLEEP_NEVER: "Ніколі" +STR_SLEEP_TIMER_STEP_HINT: "Улева/Управа: 1 хв Уверх/Уніз: 5 хв" STR_AUTO_TURN_ENABLED: "Аўтаперагортванне: " STR_AUTO_TURN_PAGES_PER_MIN: "Аўтаперагортванне (старонак за хвіліну)" STR_TILT_PAGE_TURN: "Перагортванне нахілам" diff --git a/lib/I18n/translations/catalan.yaml b/lib/I18n/translations/catalan.yaml index 739c66be..a3036366 100644 --- a/lib/I18n/translations/catalan.yaml +++ b/lib/I18n/translations/catalan.yaml @@ -154,7 +154,6 @@ STR_ALIGN_LEFT: "Esquerra" STR_CENTER: "Centre" STR_ALIGN_RIGHT: "Dreta" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -304,6 +303,9 @@ STR_OPDS_SERVER_URL: "URL del servidor OPDS" STR_FOOTNOTES: "Notes al peu" STR_NO_FOOTNOTES: "No hi ha notes al peu en aquesta pàgina" STR_LINK: "[enllaç]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Mai" +STR_SLEEP_TIMER_STEP_HINT: "Esquerra/Dreta: 1 min Amunt/Avall: 5 min" STR_SCREENSHOT_BUTTON: "Fes una captura de pantalla" STR_AUTO_TURN_ENABLED: "Passar automàtic activat: " STR_AUTO_TURN_PAGES_PER_MIN: "Passar automàtic (pàgines per minut)" diff --git a/lib/I18n/translations/czech.yaml b/lib/I18n/translations/czech.yaml index 75ce495b..32450c19 100644 --- a/lib/I18n/translations/czech.yaml +++ b/lib/I18n/translations/czech.yaml @@ -148,7 +148,6 @@ STR_ALIGN_LEFT: "Vlevo" STR_CENTER: "Na střed" STR_ALIGN_RIGHT: "Vpravo" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -273,4 +272,7 @@ STR_EMBEDDED_STYLE: "Vložený styl" STR_FOCUS_READING: "Soustředěné čtení" STR_OPDS_SERVER_URL: "URL serveru OPDS" STR_SCREENSHOT_BUTTON: "Udělat snímek obrazovky" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Nikdy" +STR_SLEEP_TIMER_STEP_HINT: "Vlevo/Vpravo: 1 min Nahoru/Dolů: 5 min" STR_TILT_PAGE_TURN: "Otáčení stránek nakloněním" diff --git a/lib/I18n/translations/danish.yaml b/lib/I18n/translations/danish.yaml index bbea5c2a..53f8ad20 100644 --- a/lib/I18n/translations/danish.yaml +++ b/lib/I18n/translations/danish.yaml @@ -153,7 +153,6 @@ STR_ALIGN_LEFT: "Venstre" STR_CENTER: "Centreret" STR_ALIGN_RIGHT: "Højre" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -298,6 +297,9 @@ STR_OPDS_SERVER_URL: "OPDS Server URL" STR_FOOTNOTES: "Fodnoter" STR_NO_FOOTNOTES: "Ingen fodnoter på denne side" STR_LINK: "[link]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Aldrig" +STR_SLEEP_TIMER_STEP_HINT: "Venstre/Højre: 1 min Op/Ned: 5 min" STR_SCREENSHOT_BUTTON: "Tag skærmbillede" STR_AUTO_TURN_ENABLED: "Automatisk sidevendning aktiveret: " STR_AUTO_TURN_PAGES_PER_MIN: "Automatisk vending (sider per minut)" diff --git a/lib/I18n/translations/dutch.yaml b/lib/I18n/translations/dutch.yaml index 67a09da0..8d1a44f8 100644 --- a/lib/I18n/translations/dutch.yaml +++ b/lib/I18n/translations/dutch.yaml @@ -153,7 +153,6 @@ STR_ALIGN_LEFT: "Links" STR_CENTER: "Centreren" STR_ALIGN_RIGHT: "Rechts" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -298,6 +297,9 @@ STR_OPDS_SERVER_URL: "OPDS-server URL" STR_FOOTNOTES: "Voetnoten" STR_NO_FOOTNOTES: "Geen voetnoten op deze pagina" STR_LINK: "[link]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Nooit" +STR_SLEEP_TIMER_STEP_HINT: "Links/Rechts: 1 min Omhoog/Omlaag: 5 min" STR_SCREENSHOT_BUTTON: "Screenshot maken" STR_AUTO_TURN_ENABLED: "Automatisch omslaan ingeschakeld: " STR_AUTO_TURN_PAGES_PER_MIN: "Autom. omslaan (pagina's per minuut)" diff --git a/lib/I18n/translations/english.yaml b/lib/I18n/translations/english.yaml index 0e3105de..2136f6e7 100644 --- a/lib/I18n/translations/english.yaml +++ b/lib/I18n/translations/english.yaml @@ -156,7 +156,6 @@ STR_ALIGN_LEFT: "Left" STR_CENTER: "Center" STR_ALIGN_RIGHT: "Right" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -330,6 +329,9 @@ STR_FOOTNOTES: "Footnotes" STR_NO_FOOTNOTES: "No footnotes on this page" STR_LINK: "[link]" STR_SCREENSHOT_BUTTON: "Take screenshot" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Never" +STR_SLEEP_TIMER_STEP_HINT: "Left/Right: 1 min Up/Down: 5 min" STR_ADD_SERVER: "Add Server" STR_SERVER_NAME: "Server Name" STR_NO_SERVERS: "No OPDS servers configured" diff --git a/lib/I18n/translations/finnish.yaml b/lib/I18n/translations/finnish.yaml index 9e44573c..3a22a4cf 100644 --- a/lib/I18n/translations/finnish.yaml +++ b/lib/I18n/translations/finnish.yaml @@ -148,7 +148,6 @@ STR_ALIGN_LEFT: "Vasen" STR_CENTER: "Keskitetty" STR_ALIGN_RIGHT: "Oikea" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -271,4 +270,7 @@ STR_EMBEDDED_STYLE: "Upotettu tyyli" STR_FOCUS_READING: "Keskittynyt lukeminen" STR_OPDS_SERVER_URL: "OPDS-palvelimen osoite" STR_SCREENSHOT_BUTTON: "Ota kuvakaappaus" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Ei koskaan" +STR_SLEEP_TIMER_STEP_HINT: "Vasen/Oikea: 1 min Ylös/Alas: 5 min" STR_TILT_PAGE_TURN: "Sivunkääntö kallistamalla" diff --git a/lib/I18n/translations/french.yaml b/lib/I18n/translations/french.yaml index 0db131a4..8497c8eb 100644 --- a/lib/I18n/translations/french.yaml +++ b/lib/I18n/translations/french.yaml @@ -153,7 +153,6 @@ STR_ALIGN_LEFT: "Gauche" STR_CENTER: "Centré" STR_ALIGN_RIGHT: "Droite" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -299,6 +298,9 @@ STR_OPDS_SERVER_URL: "URL serveur OPDS" STR_FOOTNOTES: "Notes de bas de page" STR_NO_FOOTNOTES: "Aucune note sur cette page" STR_LINK: "[lien]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Jamais" +STR_SLEEP_TIMER_STEP_HINT: "Gauche/Droite : 1 min Haut/Bas : 5 min" STR_SCREENSHOT_BUTTON: "Capture d'écran" STR_AUTO_TURN_ENABLED: "Tourne-page auto : " STR_AUTO_TURN_PAGES_PER_MIN: "Tourne-page auto (pages par minute)" diff --git a/lib/I18n/translations/german.yaml b/lib/I18n/translations/german.yaml index ac417fde..31b87bb3 100644 --- a/lib/I18n/translations/german.yaml +++ b/lib/I18n/translations/german.yaml @@ -151,7 +151,6 @@ STR_ALIGN_LEFT: "Links" STR_CENTER: "Zentriert" STR_ALIGN_RIGHT: "Rechts" STR_MIN_1: "1 Min" -STR_MIN_3: "3 Min" STR_MIN_5: "5 Min" STR_MIN_10: "10 Min" STR_MIN_15: "15 Min" @@ -299,6 +298,9 @@ STR_SCREENSHOT_BUTTON: "Screenshot aufnehmen" STR_FOOTNOTES: "Fußnoten" STR_NO_FOOTNOTES: "Keine Fußnoten auf dieser Seite" STR_LINK: "[Link]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u Min." +STR_SLEEP_NEVER: "Nie" +STR_SLEEP_TIMER_STEP_HINT: "Links/Rechts: 1 Min. Hoch/Runter: 5 Min." STR_AUTO_TURN_ENABLED: "Auto-Umblättern aktiv: " STR_AUTO_TURN_PAGES_PER_MIN: "Auto-Umblättern (Seiten/Min.)" STR_IMAGES: "Bilder" diff --git a/lib/I18n/translations/hungarian.yaml b/lib/I18n/translations/hungarian.yaml index 8da9c204..e40fe819 100644 --- a/lib/I18n/translations/hungarian.yaml +++ b/lib/I18n/translations/hungarian.yaml @@ -150,7 +150,6 @@ STR_ALIGN_LEFT: "Bal" STR_CENTER: "Közép" STR_ALIGN_RIGHT: "Jobb" STR_MIN_1: "1 perc" -STR_MIN_3: "3 perc" STR_MIN_5: "5 perc" STR_MIN_10: "10 perc" STR_MIN_15: "15 perc" @@ -295,6 +294,9 @@ STR_OPDS_SERVER_URL: "OPDS szerver URL" STR_FOOTNOTES: "Lábjegyzetek" STR_NO_FOOTNOTES: "Nincsenek lábjegyzetek ezen az oldalon" STR_LINK: "[link]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u perc" +STR_SLEEP_NEVER: "Soha" +STR_SLEEP_TIMER_STEP_HINT: "Bal/Jobb: 1 perc Fel/Le: 5 perc" STR_SCREENSHOT_BUTTON: "Képernyőkép készítése" STR_AUTO_TURN_ENABLED: "Automatikus lapozás bekapcsolva: " STR_AUTO_TURN_PAGES_PER_MIN: "Automatikus lapozás (oldal/perc)" diff --git a/lib/I18n/translations/italian.yaml b/lib/I18n/translations/italian.yaml index 198176ba..0277ac9a 100644 --- a/lib/I18n/translations/italian.yaml +++ b/lib/I18n/translations/italian.yaml @@ -154,7 +154,6 @@ STR_ALIGN_LEFT: "Sinistra" STR_CENTER: "Centrato" STR_ALIGN_RIGHT: "Destra" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -308,6 +307,9 @@ STR_SET_SLEEP_COVER: "Imposta copertina" STR_FOOTNOTES: "Note a piè pagina" STR_NO_FOOTNOTES: "Nessuna nota in questa pagina" STR_LINK: "[link]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Mai" +STR_SLEEP_TIMER_STEP_HINT: "Sinistra/Destra: 1 min Su/Giù: 5 min" STR_SCREENSHOT_BUTTON: "Screenshot" STR_ADD_SERVER: "Aggiungi server" STR_SERVER_NAME: "Nome server" diff --git a/lib/I18n/translations/kazakh.yaml b/lib/I18n/translations/kazakh.yaml index 7e909a92..14c6f75d 100644 --- a/lib/I18n/translations/kazakh.yaml +++ b/lib/I18n/translations/kazakh.yaml @@ -144,7 +144,6 @@ STR_ALIGN_LEFT: "Солға" STR_CENTER: "Ортаға" STR_ALIGN_RIGHT: "Оңға" STR_MIN_1: "1 мин" -STR_MIN_3: "3 мин" STR_MIN_5: "5 мин" STR_MIN_10: "10 мин" STR_MIN_15: "15 мин" @@ -294,6 +293,9 @@ STR_DISPLAY_QR: "Бетті QR ретінде көрсету" STR_FOOTNOTES: "Түсіндірме жазбалар" STR_NO_FOOTNOTES: "Бұл бетте түсіндірме жазбалар жоқ" STR_LINK: "[сілтеме]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u мин" +STR_SLEEP_NEVER: "Ешқашан" +STR_SLEEP_TIMER_STEP_HINT: "Сол/Оң: 1 мин Жоғары/Төмен: 5 мин" STR_SCREENSHOT_BUTTON: "Скриншот түсіру" STR_AUTO_TURN_ENABLED: "Автоматты бет аудару қосулы: " STR_AUTO_TURN_PAGES_PER_MIN: "Автоматты бет аудару (минутына бет саны)" diff --git a/lib/I18n/translations/lithuanian.yaml b/lib/I18n/translations/lithuanian.yaml index 636255cc..b9e8701f 100644 --- a/lib/I18n/translations/lithuanian.yaml +++ b/lib/I18n/translations/lithuanian.yaml @@ -150,7 +150,6 @@ STR_ALIGN_LEFT: "Kairė" STR_CENTER: "Centras" STR_ALIGN_RIGHT: "Dešinė" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -295,6 +294,9 @@ STR_OPDS_SERVER_URL: "OPDS URL" STR_FOOTNOTES: "Išnašos" STR_NO_FOOTNOTES: "Šiame psl. išnašų nėra" STR_LINK: "[nuoroda]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min." +STR_SLEEP_NEVER: "Niekada" +STR_SLEEP_TIMER_STEP_HINT: "Kairė/Dešinė: 1 min. Viršus/Apačia: 5 min." STR_SCREENSHOT_BUTTON: "Ekrano nuotrauka" STR_AUTO_TURN_ENABLED: "Auto-vertimas: " STR_AUTO_TURN_PAGES_PER_MIN: "Auto-vertimas (psl/min)" diff --git a/lib/I18n/translations/polish.yaml b/lib/I18n/translations/polish.yaml index c82c85dd..8309f8e8 100644 --- a/lib/I18n/translations/polish.yaml +++ b/lib/I18n/translations/polish.yaml @@ -154,7 +154,6 @@ STR_ALIGN_LEFT: "Lewo" STR_CENTER: "Środek" STR_ALIGN_RIGHT: "Prawo" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -308,6 +307,9 @@ STR_SET_SLEEP_COVER: "Ustaw okładkę" STR_FOOTNOTES: "Przypisy" STR_NO_FOOTNOTES: "Brak przypisów na tej stronie" STR_LINK: "[link]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Nigdy" +STR_SLEEP_TIMER_STEP_HINT: "Lewo/Prawo: 1 min Góra/Dół: 5 min" STR_SCREENSHOT_BUTTON: "Zrób zrzut ekranu" STR_ADD_SERVER: "Dodaj serwer" STR_SERVER_NAME: "Nazwa serwera" diff --git a/lib/I18n/translations/portuguese.yaml b/lib/I18n/translations/portuguese.yaml index aa534893..6d7ed92f 100644 --- a/lib/I18n/translations/portuguese.yaml +++ b/lib/I18n/translations/portuguese.yaml @@ -148,7 +148,6 @@ STR_ALIGN_LEFT: "Esquerda" STR_CENTER: "Centralizar" STR_ALIGN_RIGHT: "Direita" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -273,4 +272,7 @@ STR_EMBEDDED_STYLE: "Estilo embutido" STR_FOCUS_READING: "Leitura focada" STR_OPDS_SERVER_URL: "URL do servidor OPDS" STR_SCREENSHOT_BUTTON: "Capturar tela" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Nunca" +STR_SLEEP_TIMER_STEP_HINT: "Esq/Dir: 1 min Cima/Baixo: 5 min" STR_TILT_PAGE_TURN: "Virar página por inclinação" diff --git a/lib/I18n/translations/romanian.yaml b/lib/I18n/translations/romanian.yaml index 886ccb32..4c0e2a73 100644 --- a/lib/I18n/translations/romanian.yaml +++ b/lib/I18n/translations/romanian.yaml @@ -153,7 +153,6 @@ STR_ALIGN_LEFT: "Stânga" STR_CENTER: "Centru" STR_ALIGN_RIGHT: "Dreapta" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -298,6 +297,9 @@ STR_OPDS_SERVER_URL: "URL server OPDS" STR_FOOTNOTES: "Note de subsol" STR_NO_FOOTNOTES: "Nicio notă de subsol" STR_LINK: "[link]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Niciodată" +STR_SLEEP_TIMER_STEP_HINT: "Stânga/Dreapta: 1 min Sus/Jos: 5 min" STR_SCREENSHOT_BUTTON: "Captură ecran" STR_AUTO_TURN_ENABLED: "Răsfoire automată: " STR_AUTO_TURN_PAGES_PER_MIN: "Pagini pe minut" diff --git a/lib/I18n/translations/russian.yaml b/lib/I18n/translations/russian.yaml index ad26999f..25aab2dd 100644 --- a/lib/I18n/translations/russian.yaml +++ b/lib/I18n/translations/russian.yaml @@ -155,7 +155,6 @@ STR_ALIGN_LEFT: "По левому краю" STR_CENTER: "По центру" STR_ALIGN_RIGHT: "По правому краю" STR_MIN_1: "1 мин" -STR_MIN_3: "3 мин" STR_MIN_5: "5 мин" STR_MIN_10: "10 мин" STR_MIN_15: "15 мин" @@ -314,6 +313,9 @@ STR_SET_SLEEP_COVER: "Обложкой" STR_FOOTNOTES: "Примечания" STR_NO_FOOTNOTES: "На данной странице нет примечаний" STR_LINK: "[ссылка]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u мин" +STR_SLEEP_NEVER: "Никогда" +STR_SLEEP_TIMER_STEP_HINT: "Влево/Вправо: 1 мин Вверх/Вниз: 5 мин" STR_SCREENSHOT_BUTTON: "Сделать снимок экрана" STR_ADD_SERVER: "Добавить сервер" STR_SERVER_NAME: "Имя сервера" diff --git a/lib/I18n/translations/slovenian.yaml b/lib/I18n/translations/slovenian.yaml index 3d862522..2e04edeb 100644 --- a/lib/I18n/translations/slovenian.yaml +++ b/lib/I18n/translations/slovenian.yaml @@ -150,7 +150,6 @@ STR_ALIGN_LEFT: "Levo" STR_CENTER: "Sredinsko" STR_ALIGN_RIGHT: "Desno" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -295,6 +294,9 @@ STR_OPDS_SERVER_URL: "URL OPDS strežnika" STR_FOOTNOTES: "Opombe" STR_NO_FOOTNOTES: "Na tej strani ni opomb" STR_LINK: "[povezava]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Nikoli" +STR_SLEEP_TIMER_STEP_HINT: "Levo/desno: 1 min Gor/dol: 5 min" STR_SCREENSHOT_BUTTON: "Naredi posnetek zaslona" STR_AUTO_TURN_ENABLED: "Samodejno obračanje: " STR_AUTO_TURN_PAGES_PER_MIN: "Samodejno obračanje (strani na minuto)" diff --git a/lib/I18n/translations/spanish.yaml b/lib/I18n/translations/spanish.yaml index 6ae4b7fd..81c6f1af 100644 --- a/lib/I18n/translations/spanish.yaml +++ b/lib/I18n/translations/spanish.yaml @@ -155,7 +155,6 @@ STR_ALIGN_LEFT: "Izquierda" STR_CENTER: "Centro" STR_ALIGN_RIGHT: "Derecha" STR_MIN_1: "1 min." -STR_MIN_3: "3 min." STR_MIN_5: "5 min." STR_MIN_10: "10 min." STR_MIN_15: "15 min." @@ -329,6 +328,9 @@ STR_SET_SLEEP_COVER: "Pant. sus." STR_FOOTNOTES: "Pie de página" STR_NO_FOOTNOTES: "No hay notas al pie de esta página" STR_LINK: "[enlace]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min." +STR_SLEEP_NEVER: "Nunca" +STR_SLEEP_TIMER_STEP_HINT: "Izq./Dcha.: 1 min. Subir/Bajar: 5 min." STR_SCREENSHOT_BUTTON: "Tomar captura de pantalla" STR_ADD_SERVER: "Agregar servidor" STR_SERVER_NAME: "Nombre de servidor" diff --git a/lib/I18n/translations/swedish.yaml b/lib/I18n/translations/swedish.yaml index e00e42c2..ff9c4b09 100644 --- a/lib/I18n/translations/swedish.yaml +++ b/lib/I18n/translations/swedish.yaml @@ -156,7 +156,6 @@ STR_ALIGN_LEFT: "Vänster" STR_CENTER: "Mitten" STR_ALIGN_RIGHT: "Höger" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" @@ -330,6 +329,9 @@ STR_SET_SLEEP_COVER: "Ställ in omslag" STR_FOOTNOTES: "Fotnoter" STR_NO_FOOTNOTES: "Inga fotnoter på den här sidan" STR_LINK: "[länk]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Aldrig" +STR_SLEEP_TIMER_STEP_HINT: "Vänster/Höger: 1 min Upp/Ner: 5 min" STR_SCREENSHOT_BUTTON: "Ta en skärmdump" STR_ADD_SERVER: "Lägg till server" STR_SERVER_NAME: "Servernamn" diff --git a/lib/I18n/translations/turkish.yaml b/lib/I18n/translations/turkish.yaml index 1ee6dbc3..f87aef7b 100644 --- a/lib/I18n/translations/turkish.yaml +++ b/lib/I18n/translations/turkish.yaml @@ -148,7 +148,6 @@ STR_ALIGN_LEFT: "Sola Yasla" STR_CENTER: "Ortala" STR_ALIGN_RIGHT: "Sağa Yasla" STR_MIN_1: "1 dak" -STR_MIN_3: "3 dak" STR_MIN_5: "5 dak" STR_MIN_10: "10 dak" STR_MIN_15: "15 dak" @@ -289,6 +288,9 @@ STR_IMAGES_DISPLAY: "Göster" STR_IMAGES_PLACEHOLDER: "Yer Tutucu" STR_IMAGES_SUPPRESS: "Bastır" STR_LINK: "[bağlantı]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u dak" +STR_SLEEP_NEVER: "Asla" +STR_SLEEP_TIMER_STEP_HINT: "Sol/Sağ: 1 dak Yukarı/Aşağı: 5 dak" STR_NO_FILES_FOUND: "Dosya bulunamadı" STR_NO_FOOTNOTES: "Bu sayfada dipnot yok" STR_PREVIEW: "Önizleme" diff --git a/lib/I18n/translations/ukrainian.yaml b/lib/I18n/translations/ukrainian.yaml index 218f0c88..f41b8487 100644 --- a/lib/I18n/translations/ukrainian.yaml +++ b/lib/I18n/translations/ukrainian.yaml @@ -154,7 +154,6 @@ STR_ALIGN_LEFT: "За лівим краєм" STR_CENTER: "По центру" STR_ALIGN_RIGHT: "За правим краєм" STR_MIN_1: "1 хв" -STR_MIN_3: "3 хв" STR_MIN_5: "5 хв" STR_MIN_10: "10 хв" STR_MIN_15: "15 хв" @@ -308,6 +307,9 @@ STR_SET_SLEEP_COVER: "Як обкл." STR_FOOTNOTES: "Примітки" STR_NO_FOOTNOTES: "На цій сторінці немає приміток" STR_LINK: "[посилання]" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u хв" +STR_SLEEP_NEVER: "Ніколи" +STR_SLEEP_TIMER_STEP_HINT: "Вліво/Вправо: 1 хв Вгору/Вниз: 5 хв" STR_SCREENSHOT_BUTTON: "Знімок екрана" STR_ADD_SERVER: "Додати сервер" STR_SERVER_NAME: "Назва сервера" diff --git a/lib/I18n/translations/valencian.yaml b/lib/I18n/translations/valencian.yaml index 59a78fbc..9e3da89a 100644 --- a/lib/I18n/translations/valencian.yaml +++ b/lib/I18n/translations/valencian.yaml @@ -85,6 +85,9 @@ STR_SCREEN_MARGIN: "Marge de pantalla del lector" STR_PARA_ALIGNMENT: "Alineació de paràgrafs del lector" STR_HYPHENATION: "Partició de mots" STR_TIME_TO_SLEEP: "Temps per entrar en repòs" +STR_SLEEP_TIMER_VALUE_FORMAT: "%u min" +STR_SLEEP_NEVER: "Mai" +STR_SLEEP_TIMER_STEP_HINT: "Esquerra/Dreta: 1 min Amunt/Avall: 5 min" STR_SHOW_HIDDEN_FILES: "Mostra arxius ocults" STR_REMOVE_READ_FROM_RECENTS: "Esborra els llibres llegits de la llista de recents" STR_MOVE_FINISHED_TO_READ: "Mou els llibres acabats a la carpeta Read" @@ -155,7 +158,6 @@ STR_ALIGN_LEFT: "Esquerra" STR_CENTER: "Centre" STR_ALIGN_RIGHT: "Dreta" STR_MIN_1: "1 min" -STR_MIN_3: "3 min" STR_MIN_5: "5 min" STR_MIN_10: "10 min" STR_MIN_15: "15 min" diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index cbf46e9d..d3ec2131 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -79,6 +79,22 @@ void CrossPointSettings::validateFrontButtonMapping(CrossPointSettings& settings } } +uint8_t CrossPointSettings::sleepTimeoutEnumToMinutes(const uint8_t legacyValue) { + switch (legacyValue) { + case SLEEP_1_MIN: + return 1; + case SLEEP_5_MIN: + return 5; + case SLEEP_15_MIN: + return 15; + case SLEEP_30_MIN: + return 30; + case SLEEP_10_MIN: + default: + return 10; + } +} + bool CrossPointSettings::saveToFile() const { Storage.mkdir("/.crosspoint"); return JsonSettingsIO::saveSettings(*this, SETTINGS_FILE_JSON); @@ -186,7 +202,9 @@ bool CrossPointSettings::loadFromBinaryFile() { if (++settingsRead >= fileSettingsCount) break; readAndValidate(inputFile, paragraphAlignment, PARAGRAPH_ALIGNMENT_COUNT); if (++settingsRead >= fileSettingsCount) break; - readAndValidate(inputFile, sleepTimeout, SLEEP_TIMEOUT_COUNT); + uint8_t legacySleepTimeout = SLEEP_10_MIN; + readAndValidate(inputFile, legacySleepTimeout, SLEEP_TIMEOUT_COUNT); + sleepTimeoutMinutes = sleepTimeoutEnumToMinutes(legacySleepTimeout); if (++settingsRead >= fileSettingsCount) break; readAndValidate(inputFile, refreshFrequency, REFRESH_FREQUENCY_COUNT); if (++settingsRead >= fileSettingsCount) break; @@ -304,22 +322,10 @@ float CrossPointSettings::getReaderLineCompression() const { } unsigned long CrossPointSettings::getSleepTimeoutMs() const { - switch (sleepTimeout) { - case SLEEP_1_MIN: - return 1UL * 60 * 1000; - case SLEEP_3_MIN: - return 3UL * 60 * 1000; - case SLEEP_5_MIN: - return 5UL * 60 * 1000; - case SLEEP_10_MIN: - return 10UL * 60 * 1000; - case SLEEP_15_MIN: - return 15UL * 60 * 1000; - case SLEEP_30_MIN: - return 30UL * 60 * 1000; - default: - return 10UL * 60 * 1000; - } + if (sleepTimeoutMinutes >= SLEEP_TIMEOUT_NEVER_MINUTES) return 0UL; + const uint8_t minutes = + std::clamp(sleepTimeoutMinutes, MIN_SLEEP_TIMEOUT_MINUTES, static_cast(SLEEP_TIMEOUT_NEVER_MINUTES - 1)); + return static_cast(minutes) * 60UL * 1000UL; } int CrossPointSettings::getRefreshFrequency() const { diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index c4bbc6b5..a8b99a68 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -115,11 +115,10 @@ class CrossPointSettings { // Auto-sleep timeout options (in minutes) enum SLEEP_TIMEOUT { SLEEP_1_MIN = 0, - SLEEP_3_MIN = 1, - SLEEP_5_MIN = 2, - SLEEP_10_MIN = 3, - SLEEP_15_MIN = 4, - SLEEP_30_MIN = 5, + SLEEP_5_MIN = 1, + SLEEP_10_MIN = 2, + SLEEP_15_MIN = 3, + SLEEP_30_MIN = 4, SLEEP_TIMEOUT_COUNT }; @@ -210,8 +209,8 @@ class CrossPointSettings { uint8_t fontSize = MEDIUM; uint8_t lineSpacing = NORMAL; uint8_t paragraphAlignment = JUSTIFIED; - // Auto-sleep timeout setting (default 10 minutes) - uint8_t sleepTimeout = SLEEP_10_MIN; + // Auto-sleep timeout setting (default 10 minutes). Legacy sleepTimeout enum values are migration-only. + uint8_t sleepTimeoutMinutes = 10; // E-ink refresh frequency (default 15 pages) uint8_t refreshFrequency = REFRESH_15; uint8_t hyphenationEnabled = 0; @@ -256,6 +255,10 @@ class CrossPointSettings { // Get singleton instance static CrossPointSettings& getInstance() { return instance; } + static constexpr uint8_t MIN_SLEEP_TIMEOUT_MINUTES = 1; + static constexpr uint8_t SLEEP_TIMEOUT_NEVER_MINUTES = 31; + static constexpr uint8_t MAX_SLEEP_TIMEOUT_MINUTES = SLEEP_TIMEOUT_NEVER_MINUTES; + // Callback to resolve SD card font IDs. Set by SdCardFontSystem::begin(). // Returns font ID or 0 if not found. using SdFontIdResolver = int (*)(void* ctx, const char* familyName, uint8_t fontSize); @@ -274,6 +277,7 @@ class CrossPointSettings { bool loadFromFile(); static void validateFrontButtonMapping(CrossPointSettings& settings); + static uint8_t sleepTimeoutEnumToMinutes(uint8_t legacyValue); private: bool loadFromBinaryFile(); diff --git a/src/JsonSettingsIO.cpp b/src/JsonSettingsIO.cpp index ef79a30c..d9c15d39 100644 --- a/src/JsonSettingsIO.cpp +++ b/src/JsonSettingsIO.cpp @@ -224,6 +224,13 @@ bool JsonSettingsIO::loadSettings(CrossPointSettings& s, const char* json, bool* } } + if (doc["sleepTimeoutMinutes"].isNull() && !doc["sleepTimeout"].isNull()) { + const uint8_t legacyValue = + clamp(doc["sleepTimeout"] | (uint8_t)CrossPointSettings::SLEEP_10_MIN, CrossPointSettings::SLEEP_TIMEOUT_COUNT, + (uint8_t)CrossPointSettings::SLEEP_10_MIN); + s.sleepTimeoutMinutes = CrossPointSettings::sleepTimeoutEnumToMinutes(legacyValue); + if (needsResave) *needsResave = true; + } // Front button remap — managed by RemapFrontButtons sub-activity, not in SettingsList. using S = CrossPointSettings; s.frontButtonBack = diff --git a/src/SettingsList.h b/src/SettingsList.h index 19c31c3f..38a338a0 100644 --- a/src/SettingsList.h +++ b/src/SettingsList.h @@ -178,10 +178,10 @@ inline std::vector getSettingsList(const SdCardFontRegistry* regist "shortPwrBtn", StrId::STR_CAT_CONTROLS), // --- System --- - SettingInfo::Enum(StrId::STR_TIME_TO_SLEEP, &CrossPointSettings::sleepTimeout, - {StrId::STR_MIN_1, StrId::STR_MIN_3, StrId::STR_MIN_5, StrId::STR_MIN_10, StrId::STR_MIN_15, - StrId::STR_MIN_30}, - "sleepTimeout", StrId::STR_CAT_SYSTEM), + SettingInfo::Value( + StrId::STR_TIME_TO_SLEEP, &CrossPointSettings::sleepTimeoutMinutes, + {CrossPointSettings::MIN_SLEEP_TIMEOUT_MINUTES, CrossPointSettings::MAX_SLEEP_TIMEOUT_MINUTES, 1}, + "sleepTimeoutMinutes", StrId::STR_CAT_SYSTEM), SettingInfo::Toggle(StrId::STR_SHOW_HIDDEN_FILES, &CrossPointSettings::showHiddenFiles, "showHiddenFiles", StrId::STR_CAT_SYSTEM), SettingInfo::Toggle(StrId::STR_REMOVE_READ_FROM_RECENTS, &CrossPointSettings::removeReadBooksFromRecents, diff --git a/src/activities/ActivityResult.h b/src/activities/ActivityResult.h index 84aa91c6..cc996967 100644 --- a/src/activities/ActivityResult.h +++ b/src/activities/ActivityResult.h @@ -32,6 +32,10 @@ struct PercentResult { int percent = 0; }; +struct IntervalResult { + uint32_t value = 0; +}; + struct PageResult { uint32_t page = 0; }; @@ -55,8 +59,9 @@ struct FilePathResult { std::string path; }; -using ResultVariant = std::variant; +using ResultVariant = + std::variant; struct ActivityResult { bool isCancelled = false; diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index 8a5888d9..5e8b5773 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -3,6 +3,10 @@ #include #include +#include +#include +#include + #include "ButtonRemapActivity.h" #include "ClearCacheActivity.h" #include "CrossPointSettings.h" @@ -18,6 +22,7 @@ #include "SettingsList.h" #include "StatusBarSettingsActivity.h" #include "activities/network/WifiSelectionActivity.h" +#include "activities/util/IntervalSelectionActivity.h" #include "components/UITheme.h" #include "fontIds.h" @@ -183,6 +188,11 @@ void SettingsActivity::toggleCurrentSetting() { const bool sleepScreenChanged = setting.valuePtr == &CrossPointSettings::sleepScreen; const bool quickResumeTimeoutChanged = setting.valuePtr == &CrossPointSettings::quickResumeSleepScreen; + if (setting.nameId == StrId::STR_TIME_TO_SLEEP) { + openSleepTimeoutPicker(); + return; + } + if (setting.type == SettingType::TOGGLE && setting.valuePtr != nullptr) { // Toggle the boolean value using the member pointer const bool currentValue = SETTINGS.*(setting.valuePtr); @@ -286,6 +296,22 @@ void SettingsActivity::syncQuickResumeTimeoutForSleepScreen(bool sleepScreenChan } } +void SettingsActivity::openSleepTimeoutPicker() { + startActivityForResult( + std::make_unique( + renderer, mappedInput, "SleepTimeoutInterval", StrId::STR_TIME_TO_SLEEP, StrId::STR_SLEEP_TIMER_STEP_HINT, + SETTINGS.sleepTimeoutMinutes, CrossPointSettings::MIN_SLEEP_TIMEOUT_MINUTES, + CrossPointSettings::MAX_SLEEP_TIMEOUT_MINUTES, 1, 5, StrId::STR_SLEEP_TIMER_VALUE_FORMAT, false, true, + StrId::STR_SLEEP_NEVER), + [this](const ActivityResult& result) { + if (!result.isCancelled) { + SETTINGS.sleepTimeoutMinutes = static_cast(std::get(result.data).value); + SETTINGS.saveToFile(); + } + requestUpdate(); + }); +} + void SettingsActivity::render(RenderLock&&) { renderer.clearScreen(); @@ -330,16 +356,30 @@ void SettingsActivity::render(RenderLock&&) { valueText = I18N.get(setting.enumValues[value]); } } else if (setting.type == SettingType::VALUE && setting.valuePtr != nullptr) { - valueText = std::to_string(SETTINGS.*(setting.valuePtr)); + if (setting.nameId == StrId::STR_TIME_TO_SLEEP) { + char valueBuffer[32]; + if (SETTINGS.sleepTimeoutMinutes >= CrossPointSettings::SLEEP_TIMEOUT_NEVER_MINUTES) { + valueText = tr(STR_SLEEP_NEVER); + } else { + snprintf(valueBuffer, sizeof(valueBuffer), tr(STR_SLEEP_TIMER_VALUE_FORMAT), + static_cast(SETTINGS.*(setting.valuePtr))); + valueText = valueBuffer; + } + } else { + valueText = std::to_string(SETTINGS.*(setting.valuePtr)); + } } return valueText; }, true); // Draw help text - const auto confirmLabel = (selectedSettingIndex == 0) - ? I18N.get(categoryNames[(selectedCategoryIndex + 1) % categoryCount]) - : tr(STR_TOGGLE); + const auto confirmLabel = + (selectedSettingIndex == 0) + ? I18N.get(categoryNames[(selectedCategoryIndex + 1) % categoryCount]) + : (selectedSettingIndex > 0 && (*currentSettings)[selectedSettingIndex - 1].nameId == StrId::STR_TIME_TO_SLEEP + ? tr(STR_SELECT) + : tr(STR_TOGGLE)); const auto labels = mappedInput.mapLabels(tr(STR_BACK), confirmLabel, tr(STR_DIR_UP), tr(STR_DIR_DOWN)); GUI.drawButtonHints(renderer, labels.btn1, labels.btn2, labels.btn3, labels.btn4); diff --git a/src/activities/settings/SettingsActivity.h b/src/activities/settings/SettingsActivity.h index 44a22ea9..5ec639a0 100644 --- a/src/activities/settings/SettingsActivity.h +++ b/src/activities/settings/SettingsActivity.h @@ -164,6 +164,7 @@ class SettingsActivity final : public Activity { void enterCategory(int categoryIndex); void toggleCurrentSetting(); + void openSleepTimeoutPicker(); void rebuildSettingsLists(); void syncQuickResumeTimeoutForSleepScreen(bool sleepScreenChanged, bool quickResumeTimeoutChanged); diff --git a/src/activities/util/IntervalSelectionActivity.cpp b/src/activities/util/IntervalSelectionActivity.cpp new file mode 100644 index 00000000..8323b7cb --- /dev/null +++ b/src/activities/util/IntervalSelectionActivity.cpp @@ -0,0 +1,97 @@ +#include "IntervalSelectionActivity.h" + +#include +#include + +#include +#include +#include + +#include "components/UITheme.h" +#include "fontIds.h" + +int IntervalSelectionActivity::clampedValue(const int candidate) const { + return std::clamp(candidate, minValue, maxValue); +} + +void IntervalSelectionActivity::onEnter() { + Activity::onEnter(); + value = clampedValue(value); + requestUpdate(); +} + +void IntervalSelectionActivity::adjustValue(const int delta) { + value = clampedValue(value + delta); + requestUpdate(); +} + +void IntervalSelectionActivity::loop() { + if (ignoreConfirmRelease) { + if (mappedInput.wasReleased(MappedInputManager::Button::Confirm)) { + ignoreConfirmRelease = false; + return; + } + if (!mappedInput.isPressed(MappedInputManager::Button::Confirm)) { + ignoreConfirmRelease = false; + } + } + + if (mappedInput.wasReleased(MappedInputManager::Button::Back)) { + ActivityResult result; + result.isCancelled = true; + setResult(std::move(result)); + finish(); + return; + } + + if (mappedInput.wasReleased(MappedInputManager::Button::Confirm)) { + setResult(IntervalResult{static_cast(value)}); + finish(); + return; + } + + buttonNavigator.onPressAndContinuous({MappedInputManager::Button::Left}, [this] { adjustValue(-smallStep); }); + buttonNavigator.onPressAndContinuous({MappedInputManager::Button::Right}, [this] { adjustValue(smallStep); }); + buttonNavigator.onPressAndContinuous({MappedInputManager::Button::Up}, [this] { adjustValue(largeStep); }); + buttonNavigator.onPressAndContinuous({MappedInputManager::Button::Down}, [this] { adjustValue(-largeStep); }); +} + +void IntervalSelectionActivity::render(RenderLock&&) { + renderer.clearScreen(); + + renderer.drawCenteredText(UI_12_FONT_ID, 15, I18N.get(titleId), true, EpdFontFamily::BOLD); + + char formattedValue[32]; + if (maxBoundaryLabelId != StrId::STR_NONE_OPT && value == maxValue) { + snprintf(formattedValue, sizeof(formattedValue), "%s", I18N.get(maxBoundaryLabelId)); + } else if (valueFormatId != StrId::STR_NONE_OPT) { + snprintf(formattedValue, sizeof(formattedValue), I18N.get(valueFormatId), static_cast(value)); + } else { + snprintf(formattedValue, sizeof(formattedValue), "%d", value); + } + renderer.drawCenteredText(UI_12_FONT_ID, 90, formattedValue, true, EpdFontFamily::BOLD); + + const int screenWidth = renderer.getScreenWidth(); + const int barWidth = std::min(360, std::max(0, screenWidth - 40)); + constexpr int barHeight = 16; + const int barX = std::max(0, (screenWidth - barWidth) / 2); + const int barY = 140; + + renderer.drawRect(barX, barY, barWidth, barHeight); + + const int range = std::max(1, maxValue - minValue); + const int fillWidth = (barWidth - 4) * (value - minValue) / range; + if (fillWidth > 0) { + renderer.fillRect(barX + 2, barY + 2, fillWidth, barHeight - 4); + } + + const int knobX = std::max(barX + 2, barX + 2 + fillWidth - 2); + renderer.fillRect(knobX, barY - 4, 4, barHeight + 8, true); + + renderer.drawCenteredText(SMALL_FONT_ID, barY + 30, I18N.get(stepHintId), true); + + const auto labels = mappedInput.mapLabels(tr(STR_BACK), tr(STR_SELECT), "-", "+"); + GUI.drawButtonHints(renderer, labels.btn1, labels.btn2, labels.btn3, labels.btn4); + + renderer.displayBuffer(); +} diff --git a/src/activities/util/IntervalSelectionActivity.h b/src/activities/util/IntervalSelectionActivity.h new file mode 100644 index 00000000..d20fc0c4 --- /dev/null +++ b/src/activities/util/IntervalSelectionActivity.h @@ -0,0 +1,52 @@ +#pragma once + +#include + +#include "MappedInputManager.h" +#include "activities/Activity.h" +#include "util/ButtonNavigator.h" + +class GfxRenderer; + +class IntervalSelectionActivity final : public Activity { + public: + explicit IntervalSelectionActivity(GfxRenderer& renderer, MappedInputManager& mappedInput, const char* activityName, + StrId titleId, StrId stepHintId, int initialValue, int minValue, int maxValue, + int smallStep, int largeStep, StrId valueFormatId = StrId::STR_NONE_OPT, + bool readerActivity = false, bool ignoreInitialConfirmRelease = false, + StrId maxBoundaryLabelId = StrId::STR_NONE_OPT) + : Activity(activityName, renderer, mappedInput), + titleId(titleId), + stepHintId(stepHintId), + valueFormatId(valueFormatId), + maxBoundaryLabelId(maxBoundaryLabelId), + value(initialValue), + minValue(minValue), + maxValue(maxValue), + smallStep(smallStep), + largeStep(largeStep), + readerActivity(readerActivity), + ignoreConfirmRelease(ignoreInitialConfirmRelease) {} + + void onEnter() override; + void loop() override; + void render(RenderLock&&) override; + bool isReaderActivity() const override { return readerActivity; } + + private: + StrId titleId; + StrId stepHintId; + StrId valueFormatId; + StrId maxBoundaryLabelId; + int value; + int minValue; + int maxValue; + int smallStep; + int largeStep; + bool readerActivity; + bool ignoreConfirmRelease; + ButtonNavigator buttonNavigator; + + void adjustValue(int delta); + int clampedValue(int candidate) const; +}; diff --git a/src/main.cpp b/src/main.cpp index 63184439..7e8d2c4f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -574,7 +574,7 @@ void loop() { } const unsigned long sleepTimeoutMs = SETTINGS.getSleepTimeoutMs(); - if (millis() - lastActivityTime >= sleepTimeoutMs) { + if (sleepTimeoutMs > 0 && millis() - lastActivityTime >= sleepTimeoutMs) { LOG_DBG("SLP", "Auto-sleep triggered after %lu ms of inactivity", sleepTimeoutMs); enterDeepSleep(true); // This should never be hit as `enterDeepSleep` calls esp_deep_sleep_start