diff --git a/lib/I18n/translations/belarusian.yaml b/lib/I18n/translations/belarusian.yaml index 26155ee4..11b36192 100644 --- a/lib/I18n/translations/belarusian.yaml +++ b/lib/I18n/translations/belarusian.yaml @@ -301,3 +301,5 @@ STR_STEP_HINT_SIDE: "Бакавыя кнопкі:" STR_AUTO_TURN_ENABLED: "Аўтаперагортванне: " STR_AUTO_TURN_PAGES_PER_MIN: "Аўтаперагортванне (старонак за хвіліну)" STR_TILT_PAGE_TURN: "Перагортванне нахілам" +STR_ADD_HIDDEN_NETWORK: "Дадаць схаваную сетку..." +STR_ENTER_WIFI_SSID: "Увядзіце назву сеткі (SSID)" diff --git a/lib/I18n/translations/catalan.yaml b/lib/I18n/translations/catalan.yaml index 8edf54e4..ff5db58a 100644 --- a/lib/I18n/translations/catalan.yaml +++ b/lib/I18n/translations/catalan.yaml @@ -390,3 +390,5 @@ STR_FIRMWARE_WRITE_FAILED: "Ha fallat l'escriptura del firmware" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "No apaguis el dispositiu!" STR_RECOVERY_MODE: "Mode de recuperació" STR_RECOVERY_MODE_HINT: "Posa firmware.bin a l'arrel de la targeta SD i selecciona'l" +STR_ADD_HIDDEN_NETWORK: "Afegeix una xarxa oculta..." +STR_ENTER_WIFI_SSID: "Introdueix el nom de la xarxa (SSID)" diff --git a/lib/I18n/translations/czech.yaml b/lib/I18n/translations/czech.yaml index 256713ed..f77cd325 100644 --- a/lib/I18n/translations/czech.yaml +++ b/lib/I18n/translations/czech.yaml @@ -276,3 +276,5 @@ STR_SLEEP_NEVER: "Nikdy" STR_STEP_HINT_FRONT: "Přední tlačítka:" STR_STEP_HINT_SIDE: "Boční tlačítka:" STR_TILT_PAGE_TURN: "Otáčení stránek nakloněním" +STR_ADD_HIDDEN_NETWORK: "Přidat skrytou síť..." +STR_ENTER_WIFI_SSID: "Zadejte název sítě (SSID)" diff --git a/lib/I18n/translations/danish.yaml b/lib/I18n/translations/danish.yaml index c4be53b4..cf6d7d21 100644 --- a/lib/I18n/translations/danish.yaml +++ b/lib/I18n/translations/danish.yaml @@ -304,3 +304,5 @@ STR_SCREENSHOT_BUTTON: "Tag skærmbillede" STR_AUTO_TURN_ENABLED: "Automatisk sidevendning aktiveret: " STR_AUTO_TURN_PAGES_PER_MIN: "Automatisk vending (sider per minut)" STR_TILT_PAGE_TURN: "Vip for at vende side" +STR_ADD_HIDDEN_NETWORK: "Tilføj skjult netværk..." +STR_ENTER_WIFI_SSID: "Indtast netværksnavn (SSID)" diff --git a/lib/I18n/translations/dutch.yaml b/lib/I18n/translations/dutch.yaml index c82366e3..08ae4e1f 100644 --- a/lib/I18n/translations/dutch.yaml +++ b/lib/I18n/translations/dutch.yaml @@ -304,3 +304,5 @@ STR_SCREENSHOT_BUTTON: "Screenshot maken" STR_AUTO_TURN_ENABLED: "Automatisch omslaan ingeschakeld: " STR_AUTO_TURN_PAGES_PER_MIN: "Autom. omslaan (pagina's per minuut)" STR_TILT_PAGE_TURN: "Kantel om te bladeren" +STR_ADD_HIDDEN_NETWORK: "Verborgen netwerk toevoegen..." +STR_ENTER_WIFI_SSID: "Voer netwerknaam in (SSID)" diff --git a/lib/I18n/translations/english.yaml b/lib/I18n/translations/english.yaml index 5a9bc8af..aac1ea0c 100644 --- a/lib/I18n/translations/english.yaml +++ b/lib/I18n/translations/english.yaml @@ -53,6 +53,8 @@ STR_NETWORK_LEGEND: "* = Encrypted | + = Saved" STR_MAC_ADDRESS: "MAC address:" STR_CHECKING_WIFI: "Checking Wi-Fi..." STR_ENTER_WIFI_PASSWORD: "Enter Wi-Fi password" +STR_ADD_HIDDEN_NETWORK: "Add hidden network..." +STR_ENTER_WIFI_SSID: "Enter network name (SSID)" STR_TO_PREFIX: "to " STR_CALIBRE_RECEIVING: "Receiving: " STR_CALIBRE_RECEIVED: "Received: " diff --git a/lib/I18n/translations/finnish.yaml b/lib/I18n/translations/finnish.yaml index e370a850..aa9b7064 100644 --- a/lib/I18n/translations/finnish.yaml +++ b/lib/I18n/translations/finnish.yaml @@ -274,3 +274,5 @@ STR_SLEEP_NEVER: "Ei koskaan" STR_STEP_HINT_FRONT: "Etupainikkeet:" STR_STEP_HINT_SIDE: "Sivupainikkeet:" STR_TILT_PAGE_TURN: "Sivunkääntö kallistamalla" +STR_ADD_HIDDEN_NETWORK: "Lisää piilotettu verkko..." +STR_ENTER_WIFI_SSID: "Anna verkon nimi (SSID)" diff --git a/lib/I18n/translations/french.yaml b/lib/I18n/translations/french.yaml index 20ad160a..0ddce253 100644 --- a/lib/I18n/translations/french.yaml +++ b/lib/I18n/translations/french.yaml @@ -305,3 +305,5 @@ 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)" STR_TILT_PAGE_TURN: "Tourner par inclinaison" +STR_ADD_HIDDEN_NETWORK: "Ajouter un réseau masqué..." +STR_ENTER_WIFI_SSID: "Saisir le nom du réseau (SSID)" diff --git a/lib/I18n/translations/german.yaml b/lib/I18n/translations/german.yaml index babbf4a2..06078b85 100644 --- a/lib/I18n/translations/german.yaml +++ b/lib/I18n/translations/german.yaml @@ -381,3 +381,5 @@ STR_FIRMWARE_WRITE_FAILED: "Schreiben der Firmware-Datei ist fehlgeschlagen" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Nicht ausschalten!" STR_RECOVERY_MODE: "Wiederherstellungsmodus" STR_RECOVERY_MODE_HINT: "Lege firmware.bin im SD-Kartenwurzelverzeichnis ab und wähle es aus" +STR_ADD_HIDDEN_NETWORK: "Verstecktes Netzwerk hinzufügen..." +STR_ENTER_WIFI_SSID: "Netzwerknamen eingeben (SSID)" diff --git a/lib/I18n/translations/hebrew.yaml b/lib/I18n/translations/hebrew.yaml index 12196c0b..da9bbc30 100644 --- a/lib/I18n/translations/hebrew.yaml +++ b/lib/I18n/translations/hebrew.yaml @@ -392,3 +392,5 @@ STR_SLEEP_TIMER_VALUE_FORMAT: "%u דקות" STR_SLEEP_NEVER: "אף פעם" STR_STEP_HINT_FRONT: "לחצנים קדמיים:" STR_STEP_HINT_SIDE: "לחצני צד:" +STR_ADD_HIDDEN_NETWORK: "הוסף רשת מוסתרת..." +STR_ENTER_WIFI_SSID: "הזן שם רשת (SSID)" diff --git a/lib/I18n/translations/hungarian.yaml b/lib/I18n/translations/hungarian.yaml index 3098738a..b2909e84 100644 --- a/lib/I18n/translations/hungarian.yaml +++ b/lib/I18n/translations/hungarian.yaml @@ -49,6 +49,8 @@ STR_NETWORK_LEGEND: "* = Titkosított | + = Mentett" STR_MAC_ADDRESS: "MAC-cím:" STR_CHECKING_WIFI: "Wi-Fi ellenőrzése..." STR_ENTER_WIFI_PASSWORD: "Add meg a Wi-Fi jelszót" +STR_ADD_HIDDEN_NETWORK: "Rejtett hálózat hozzáadása..." +STR_ENTER_WIFI_SSID: "Add meg a hálózat nevét (SSID)" STR_TO_PREFIX: "- " STR_CALIBRE_RECEIVING: "Fogadás: " STR_CALIBRE_RECEIVED: "Fogadva: " @@ -301,3 +303,93 @@ 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)" STR_TILT_PAGE_TURN: "Döntéses lapozás" +STR_ADD_SERVER: "Szerver hozzáadása" +STR_BOOKMARKS: "Könyvjelzők" +STR_BOOKMARK_ADDED: "Könyvjelző hozzáadva." +STR_BOOKMARK_OPTION: "Könyvjelző" +STR_BOTTOM: "Alul" +STR_CLOCK: "Óra" +STR_CLOCK_FORMAT: "Óraformátum" +STR_CLOCK_FORMAT_12H: "12 órás" +STR_CLOCK_FORMAT_24H: "24 órás" +STR_CLOCK_SYNC: "Óra szinkronizálása" +STR_CLOCK_SYNCED: "Óra szinkronizálva" +STR_CLOCK_SYNCING: "Szinkronizálás NTP-ről..." +STR_CLOCK_SYNC_FAIL: "Szinkronizálás sikertelen" +STR_CLOCK_SYNC_NOW: "Óra szinkronizálása most" +STR_CLOCK_SYNC_NO_WIFI: "Wi-Fi nincs csatlakoztatva" +STR_CLOCK_SYNC_NO_WIFI_HINT: "Először csatlakozz Wi-Fi-hez, majd próbáld újra." +STR_CLOCK_SYNC_OK: "Óra szinkronizálva" +STR_CLOCK_UTC_OFFSET: "Óra UTC eltolás" +STR_CONFIRM_DELETE_BOOKMARK: "Törlöd ezt a könyvjelzőt?" +STR_CONNECTING_SAVED_WIFI: "Csatlakozás mentett Wi-Fi-hez..." +STR_CRASH_DESCRIPTION: "A részletes jelentés a crash_report.txt fájlba lett mentve. Kérjük, csatold ezt a fájlt a hibajelentéshez." +STR_CRASH_NO_REASON: "(Nem került rögzítésre ok)" +STR_CRASH_REASON: "Összeomlás oka:" +STR_CRASH_TITLE: "Rendszerösszeomlás" +STR_CURRENT_TIME: "Aktuális idő:" +STR_DELETE_SERVER: "Szerver törlése" +STR_DISABLED: "Letiltva" +STR_DOWNLOAD_ALL: "Összes letöltése" +STR_EOB_CONTINUE_WITH: "Folytatás ezzel" +STR_EOB_HOME: "Kezdőképernyő" +STR_FINDING_SAVED_WIFI: "Mentett Wi-Fi keresése..." +STR_FIRMWARE_FILE_OPEN_FAILED: "A fájl nem nyitható meg" +STR_FIRMWARE_TOO_LARGE: "A firmware túl nagy a partícióhoz" +STR_FIRMWARE_TOO_SMALL: "A firmware fájl túl kicsi" +STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Ne kapcsold ki!" +STR_FIRMWARE_UPDATE_PROMPT: "Frissíted a firmware-t?" +STR_FIRMWARE_WRITE_FAILED: "A firmware írása sikertelen" +STR_FONT_BROWSER: "Betűtípus-böngésző" +STR_FONT_INSTALLED: "Betűtípus telepítve!" +STR_FONT_INSTALL_FAILED: "A betűtípus telepítése sikertelen" +STR_FORCE_REFRESH: "Képernyő frissítése" +STR_INDEX_FAILED: "Indexelés sikertelen – érvénytelen könyv" +STR_INSTALLED: "Telepítve" +STR_INVALID_FIRMWARE: "Érvénytelen firmware fájl" +STR_KB_HINT_CLEAR_TEXT: "Tartsd nyomva a DEL-t az összes szöveg törléséhez" +STR_KB_HINT_EDIT_ENTRY: "Tartsd nyomva a FEL-t a bejegyzés szerkesztéséhez" +STR_KB_HINT_EXIT_URL_MODE: "Nyomd meg az ABC-t az URL mód elhagyásához" +STR_KB_HINT_HIDE_PASSWORD: "Tartsd nyomva a JOBBRA-t, majd nyomd meg a [***]-ot a jelszó elrejtéséhez" +STR_KB_HINT_LOWER_SECONDARY: "Tartsd nyomva a SELECT-et kisbetűért vagy másodlagos karakterért" +STR_KB_HINT_MOVE_CURSOR: "Nyomd meg a BALRA vagy JOBBRA gombot a kurzor mozgatásához" +STR_KB_HINT_RETURN_CURSOR: "Nyomd meg a BALRA-t a kurzorpozícióhoz való visszatéréshez" +STR_KB_HINT_RETURN_KEYBOARD: "Nyomd meg a LE-t a billentyűzethez való visszatéréshez" +STR_KB_HINT_SECONDARY_CHAR: "Tartsd nyomva a SELECT-et másodlagos karakterért" +STR_KB_HINT_SHOW_PASSWORD: "Tartsd nyomva a JOBBRA-t, majd nyomd meg az [abc]-t a jelszó megjelenítéséhez" +STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Nyomd meg a [***]-ot a jelszó elrejtéséhez" +STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Nyomd meg az [abc]-t a jelszó megjelenítéséhez" +STR_KB_HINT_UPPER_SECONDARY: "Tartsd nyomva a SELECT-et NAGYBETŰÉRT vagy másodlagos karakterért" +STR_KB_HINT_URL_SNIPPETS: "Nyomd meg az URL-t az URL-részletekért" +STR_KB_TIPS: "Tippek:" +STR_KOSYNC: "KOSync" +STR_LOADING_FONT_LIST: "Betűtípuslista betöltése..." +STR_LONG_PRESS_BEHAVIOR: "Hosszú gombnyomás viselkedése" +STR_LONG_PRESS_BEHAVIOR_OFF: "KI" +STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Tájolásváltás" +STR_LONG_PRESS_BEHAVIOR_SKIP: "Fejezetugrás" +STR_LONG_PRESS_MENU: "Hosszú nyomás – Menü" +STR_MANAGE_FONTS: "Betűtípusok kezelése" +STR_NEXT_FIELD: "Következő" +STR_NEXT_PAGE: "Következő oldal »" +STR_NO_BIN_FILES: "Nincs .bin fájl" +STR_NO_FONTS_AVAILABLE: "Nincs elérhető betűtípus" +STR_NO_SERVERS: "Nincs beállított OPDS szerver" +STR_OPDS_SERVERS: "OPDS szerverek" +STR_PREV_PAGE: "« Előző oldal" +STR_PWR_BTN_FOOTNOTE_BACK: "Gyors visszatérés lábjegyzetből" +STR_RECOVERY_MODE: "Helyreállítási mód" +STR_RECOVERY_MODE_HINT: "Helyezd a firmware.bin fájlt az SD-kártya gyökerébe, majd válaszd ki" +STR_RESTARTING_HINT: "Újraindítás... Ha az eszköz nem indul újra, tartsd nyomva a bekapcsológombot néhány másodpercig." +STR_SD_FIRMWARE_UPDATE: "Firmware frissítés SD-kártyáról" +STR_SEARCH: "Keresés" +STR_SELECT_FIRMWARE_FILE: "Válassz firmware fájlt (.bin)" +STR_SERVER_NAME: "Szerver neve" +STR_SET_SLEEP_COVER: "Borító beállítása" +STR_SHOW_NETWORKS: "Megjelenítés" +STR_THEME_ROUNDEDRAFF: "RoundedRaff" +STR_TOP: "Felül" +STR_UPDATE_ALL: "Összes frissítése" +STR_UPDATE_AVAILABLE: "Frissítés" +STR_VALIDATING_FIRMWARE: "Firmware ellenőrzése..." +STR_XTC_STATUS_BAR: "XTC állapotsáv" diff --git a/lib/I18n/translations/italian.yaml b/lib/I18n/translations/italian.yaml index 62b70030..eee6767e 100644 --- a/lib/I18n/translations/italian.yaml +++ b/lib/I18n/translations/italian.yaml @@ -387,3 +387,5 @@ STR_PWR_BTN_FOOTNOTE_BACK: "Rientro rapido dalle note" STR_EOB_CONTINUE_WITH: "Continua con" STR_EOB_HOME: "Home" STR_INDEX_FAILED: "Indicizzazione fallita - libro non valido" +STR_ADD_HIDDEN_NETWORK: "Aggiungi rete nascosta..." +STR_ENTER_WIFI_SSID: "Inserisci il nome della rete (SSID)" diff --git a/lib/I18n/translations/kazakh.yaml b/lib/I18n/translations/kazakh.yaml index 97472a43..6abbba5c 100644 --- a/lib/I18n/translations/kazakh.yaml +++ b/lib/I18n/translations/kazakh.yaml @@ -300,3 +300,5 @@ STR_SCREENSHOT_BUTTON: "Скриншот түсіру" STR_AUTO_TURN_ENABLED: "Автоматты бет аудару қосулы: " STR_AUTO_TURN_PAGES_PER_MIN: "Автоматты бет аудару (минутына бет саны)" STR_TILT_PAGE_TURN: "Еңкейту арқылы бет аудару" +STR_ADD_HIDDEN_NETWORK: "Жасырын желіні қосу..." +STR_ENTER_WIFI_SSID: "Желі атауын енгізіңіз (SSID)" diff --git a/lib/I18n/translations/lithuanian.yaml b/lib/I18n/translations/lithuanian.yaml index a5372f3f..7626d6b7 100644 --- a/lib/I18n/translations/lithuanian.yaml +++ b/lib/I18n/translations/lithuanian.yaml @@ -301,3 +301,5 @@ STR_SCREENSHOT_BUTTON: "Ekrano nuotrauka" STR_AUTO_TURN_ENABLED: "Auto-vertimas: " STR_AUTO_TURN_PAGES_PER_MIN: "Auto-vertimas (psl/min)" STR_TILT_PAGE_TURN: "Puslapio vertimas pakreipiant" +STR_ADD_HIDDEN_NETWORK: "Pridėti paslėptą tinklą..." +STR_ENTER_WIFI_SSID: "Įveskite tinklo pavadinimą (SSID)" diff --git a/lib/I18n/translations/polish.yaml b/lib/I18n/translations/polish.yaml index f5bbc469..e1336e45 100644 --- a/lib/I18n/translations/polish.yaml +++ b/lib/I18n/translations/polish.yaml @@ -361,3 +361,5 @@ STR_FIRMWARE_WRITE_FAILED: "Zapis oprogramowania nieudany" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Nie wyłączać!" STR_RECOVERY_MODE: "Tryb przywracania" STR_RECOVERY_MODE_HINT: "Umieść firmware.bin w głównym katalogu karty SD i wybierz go" +STR_ADD_HIDDEN_NETWORK: "Dodaj ukrytą sieć..." +STR_ENTER_WIFI_SSID: "Wprowadź nazwę sieci (SSID)" diff --git a/lib/I18n/translations/portuguese.yaml b/lib/I18n/translations/portuguese.yaml index a417a9ad..1668eb7b 100644 --- a/lib/I18n/translations/portuguese.yaml +++ b/lib/I18n/translations/portuguese.yaml @@ -384,3 +384,5 @@ STR_FIRMWARE_WRITE_FAILED: "Falha na gravação do firmware" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Não desligue o dispositivo!" STR_RECOVERY_MODE: "Modo de Recuperação" STR_RECOVERY_MODE_HINT: "Coloque o arquivo firmware.bin na raiz do cartão SD e selecione-o" +STR_ADD_HIDDEN_NETWORK: "Adicionar rede oculta..." +STR_ENTER_WIFI_SSID: "Insira o nome da rede (SSID)" diff --git a/lib/I18n/translations/romanian.yaml b/lib/I18n/translations/romanian.yaml index 60e54bd5..827175ad 100644 --- a/lib/I18n/translations/romanian.yaml +++ b/lib/I18n/translations/romanian.yaml @@ -304,3 +304,5 @@ STR_SCREENSHOT_BUTTON: "Captură ecran" STR_AUTO_TURN_ENABLED: "Răsfoire automată: " STR_AUTO_TURN_PAGES_PER_MIN: "Pagini pe minut" STR_TILT_PAGE_TURN: "Întoarcere pagină prin înclinare" +STR_ADD_HIDDEN_NETWORK: "Adaugă rețea ascunsă..." +STR_ENTER_WIFI_SSID: "Introduceți numele rețelei (SSID)" diff --git a/lib/I18n/translations/russian.yaml b/lib/I18n/translations/russian.yaml index 76961dc8..6db7d4b2 100644 --- a/lib/I18n/translations/russian.yaml +++ b/lib/I18n/translations/russian.yaml @@ -384,3 +384,5 @@ STR_FIRMWARE_WRITE_FAILED: "Ошибка записи прошивки" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Не выключайте питание!" STR_RECOVERY_MODE: "Режим восстановления" STR_RECOVERY_MODE_HINT: "Поместите firmware.bin в корень SD-карты и выберите его" +STR_ADD_HIDDEN_NETWORK: "Добавить скрытую сеть..." +STR_ENTER_WIFI_SSID: "Введите имя сети (SSID)" diff --git a/lib/I18n/translations/slovak.yaml b/lib/I18n/translations/slovak.yaml index 06a7ef96..fce33cbf 100644 --- a/lib/I18n/translations/slovak.yaml +++ b/lib/I18n/translations/slovak.yaml @@ -380,3 +380,5 @@ STR_FIRMWARE_WRITE_FAILED: "Zápis firmvéru zlyhal" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Nevypínajte zariadenie!" STR_RECOVERY_MODE: "Režim obnovenia" STR_RECOVERY_MODE_HINT: "Umiestnite firmware.bin do koreňového adresára SD karty a vyberte ho" +STR_ADD_HIDDEN_NETWORK: "Pridať skrytú sieť..." +STR_ENTER_WIFI_SSID: "Zadajte názov siete (SSID)" diff --git a/lib/I18n/translations/slovenian.yaml b/lib/I18n/translations/slovenian.yaml index 3b5d3c1b..09780706 100644 --- a/lib/I18n/translations/slovenian.yaml +++ b/lib/I18n/translations/slovenian.yaml @@ -301,3 +301,5 @@ 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)" STR_TILT_PAGE_TURN: "Obračanje s priklonom" +STR_ADD_HIDDEN_NETWORK: "Dodaj skrito omrežje..." +STR_ENTER_WIFI_SSID: "Vnesite ime omrežja (SSID)" diff --git a/lib/I18n/translations/spanish.yaml b/lib/I18n/translations/spanish.yaml index c13fbcb0..d2720471 100644 --- a/lib/I18n/translations/spanish.yaml +++ b/lib/I18n/translations/spanish.yaml @@ -390,3 +390,5 @@ STR_FIRMWARE_WRITE_FAILED: "Falló la escritura del firmware" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "¡No apague el dispositivo!" STR_RECOVERY_MODE: "Modo de recuperación" STR_RECOVERY_MODE_HINT: "Ponga firmware.bin en la raíz de la tarj. SD y selecciónelo" +STR_ADD_HIDDEN_NETWORK: "Añadir red oculta..." +STR_ENTER_WIFI_SSID: "Introduce el nombre de la red (SSID)" diff --git a/lib/I18n/translations/swedish.yaml b/lib/I18n/translations/swedish.yaml index 97e410d2..ba34feb0 100644 --- a/lib/I18n/translations/swedish.yaml +++ b/lib/I18n/translations/swedish.yaml @@ -387,3 +387,5 @@ STR_FIRMWARE_WRITE_FAILED: "Skrivning till firmware misslyckades" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Stäng inte av!" STR_RECOVERY_MODE: "Återställningsläge" STR_RECOVERY_MODE_HINT: "Placera firmware.bin i SD-kortroten och välj den" +STR_ADD_HIDDEN_NETWORK: "Lägg till dolt nätverk..." +STR_ENTER_WIFI_SSID: "Ange nätverksnamn (SSID)" diff --git a/lib/I18n/translations/turkish.yaml b/lib/I18n/translations/turkish.yaml index 7e4c58e9..cd957978 100644 --- a/lib/I18n/translations/turkish.yaml +++ b/lib/I18n/translations/turkish.yaml @@ -304,3 +304,5 @@ STR_SELECTED: "Seçili" STR_SHOW: "Göster" STR_TITLE: "Başlık" STR_TILT_PAGE_TURN: "Eğerek sayfa çevirme" +STR_ADD_HIDDEN_NETWORK: "Gizli ağ ekle..." +STR_ENTER_WIFI_SSID: "Ağ adını girin (SSID)" diff --git a/lib/I18n/translations/ukrainian.yaml b/lib/I18n/translations/ukrainian.yaml index a95e3e43..1d47c835 100644 --- a/lib/I18n/translations/ukrainian.yaml +++ b/lib/I18n/translations/ukrainian.yaml @@ -381,3 +381,5 @@ STR_FIRMWARE_WRITE_FAILED: "Помилка запису прошивки" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Не вимикайте пристрій!" STR_RECOVERY_MODE: "Режим відновлення" STR_RECOVERY_MODE_HINT: "Помістіть firmware.bin у корінь SD-карти та виберіть його" +STR_ADD_HIDDEN_NETWORK: "Додати приховану мережу..." +STR_ENTER_WIFI_SSID: "Введіть назву мережі (SSID)" diff --git a/lib/I18n/translations/valencian.yaml b/lib/I18n/translations/valencian.yaml index 371138f4..2c5ad86e 100644 --- a/lib/I18n/translations/valencian.yaml +++ b/lib/I18n/translations/valencian.yaml @@ -390,3 +390,5 @@ STR_FIRMWARE_WRITE_FAILED: "Ha fallat l'escriptura del firmware" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "No apagues el dispositiu!" STR_RECOVERY_MODE: "Mode de recuperació" STR_RECOVERY_MODE_HINT: "Posa firmware.bin a l'arrel de la targeta SD i selecciona'l" +STR_ADD_HIDDEN_NETWORK: "Afig una xarxa oculta..." +STR_ENTER_WIFI_SSID: "Introduïx el nom de la xarxa (SSID)" diff --git a/lib/I18n/translations/vietnamese.yaml b/lib/I18n/translations/vietnamese.yaml index 130f21a0..3ce82416 100644 --- a/lib/I18n/translations/vietnamese.yaml +++ b/lib/I18n/translations/vietnamese.yaml @@ -380,3 +380,5 @@ STR_FIRMWARE_WRITE_FAILED: "Ghi firmware thất bại" STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Không được tắt nguồn!" STR_RECOVERY_MODE: "Chế độ phục hồi" STR_RECOVERY_MODE_HINT: "Đặt firmware.bin ở thư mục gốc thẻ SD rồi chọn" +STR_ADD_HIDDEN_NETWORK: "Thêm mạng ẩn..." +STR_ENTER_WIFI_SSID: "Nhập tên mạng (SSID)" diff --git a/src/activities/network/WifiSelectionActivity.cpp b/src/activities/network/WifiSelectionActivity.cpp index 50b3c88d..119ae4a8 100644 --- a/src/activities/network/WifiSelectionActivity.cpp +++ b/src/activities/network/WifiSelectionActivity.cpp @@ -28,6 +28,7 @@ void WifiSelectionActivity::onEnter() { // Reset state selectedNetworkIndex = 0; networks.clear(); + realNetworkCount = 0; state = WifiSelectionState::SCANNING; selectedSSID.clear(); connectedIP.clear(); @@ -114,9 +115,13 @@ void WifiSelectionActivity::processWifiScanResults() { } if (scanResult == WIFI_SCAN_FAILED) { + networks.clear(); + realNetworkCount = 0; + appendHiddenNetworkEntry(); autoConnecting = false; manualNetworkListRequested = false; state = WifiSelectionState::NETWORK_LIST; + selectedNetworkIndex = 0; requestUpdate(); return; } @@ -158,6 +163,9 @@ void WifiSelectionActivity::processWifiScanResults() { return a.rssi > b.rssi; }); + realNetworkCount = networks.size(); + appendHiddenNetworkEntry(); + WiFi.scanDelete(); if (autoConnecting && !manualNetworkListRequested && tryNextSavedNetworkFromScan()) { @@ -171,12 +179,30 @@ void WifiSelectionActivity::processWifiScanResults() { requestUpdate(); } +void WifiSelectionActivity::appendHiddenNetworkEntry() { + // Synthetic list entry that lets the user type an SSID that is not broadcast. + // ESP32 can join hidden APs as long as the SSID is supplied to WiFi.begin(). + WifiNetworkInfo placeholder; + placeholder.rssi = 0; + placeholder.isEncrypted = true; // Treated as encrypted; an empty password still connects open APs + placeholder.hasSavedPassword = false; + placeholder.isHiddenPlaceholder = true; + networks.push_back(std::move(placeholder)); +} + void WifiSelectionActivity::selectNetwork(const int index) { if (index < 0 || index >= static_cast(networks.size())) { return; } const auto& network = networks[index]; + + // Synthetic "Add hidden network..." entry: prompt the user to type the SSID first + if (network.isHiddenPlaceholder) { + promptHiddenSsid(); + return; + } + selectedSSID = network.ssid; selectedRequiresPassword = network.isEncrypted; usedSavedPassword = false; @@ -195,27 +221,57 @@ void WifiSelectionActivity::selectNetwork(const int index) { } if (selectedRequiresPassword) { - // Show password entry - state = WifiSelectionState::PASSWORD_ENTRY; - // Don't allow screen updates while changing activity - startActivityForResult(std::make_unique(renderer, mappedInput, tr(STR_ENTER_WIFI_PASSWORD), - "", // No initial text - 64, // Max password length - InputType::Password), - [this](const ActivityResult& result) { - if (result.isCancelled) { - state = WifiSelectionState::NETWORK_LIST; - } else { - enteredPassword = std::get(result.data).text; - // state will be updated in next loop iteration - } - }); + promptPasswordEntry(); } else { // Connect directly for open networks attemptConnection(); } } +void WifiSelectionActivity::promptPasswordEntry() { + // Show password entry + state = WifiSelectionState::PASSWORD_ENTRY; + // Don't allow screen updates while changing activity + startActivityForResult(std::make_unique(renderer, mappedInput, tr(STR_ENTER_WIFI_PASSWORD), + "", // No initial text + 64, // Max password length + InputType::Password), + [this](const ActivityResult& result) { + if (result.isCancelled) { + state = WifiSelectionState::NETWORK_LIST; + } else { + enteredPassword = std::get(result.data).text; + // state will be updated in next loop iteration + } + }); +} + +void WifiSelectionActivity::promptHiddenSsid() { + selectedSSID.clear(); + selectedRequiresPassword = true; // Hidden networks are usually encrypted; empty password still joins open APs + usedSavedPassword = false; + enteredPassword.clear(); + autoConnecting = false; + + // Suppress rendering during the activity transition (see render()). + state = WifiSelectionState::HIDDEN_SSID_ENTRY; + startActivityForResult(std::make_unique(renderer, mappedInput, tr(STR_ENTER_WIFI_SSID), + "", // No initial text + 32, // Max SSID length (IEEE 802.11: 32 bytes) + InputType::Text), + [this](const ActivityResult& result) { + if (result.isCancelled) { + state = WifiSelectionState::NETWORK_LIST; + return; + } + selectedSSID = std::get(result.data).text; + if (selectedSSID.empty()) { + state = WifiSelectionState::NETWORK_LIST; + } + // Otherwise stay in HIDDEN_SSID_ENTRY; loop() continues the flow. + }); +} + bool WifiSelectionActivity::hasAttemptedAutoSsid(const std::string& ssid) const { return std::find(autoAttemptedSsids.begin(), autoAttemptedSsids.end(), ssid) != autoAttemptedSsids.end(); } @@ -422,6 +478,22 @@ void WifiSelectionActivity::loop() { return; } + // Reached once the hidden-network SSID has been entered (and was non-empty). + if (state == WifiSelectionState::HIDDEN_SSID_ENTRY) { + const auto* savedCred = WIFI_STORE.findCredential(selectedSSID); + if (savedCred && !savedCred->password.empty()) { + // We already know this hidden network - connect with the saved password + enteredPassword = savedCred->password; + usedSavedPassword = true; + LOG_DBG("WiFi", "Using saved password for hidden network %s", selectedSSID.c_str()); + attemptConnection(); + } else { + // Prompt for the password (empty password connects to open hidden APs) + promptPasswordEntry(); + } + return; + } + if (state == WifiSelectionState::PASSWORD_ENTRY) { // Reach here once password entry finished in subactivity attemptConnection(); @@ -582,9 +654,9 @@ std::string WifiSelectionActivity::getSignalStrengthIndicator(const int32_t rssi } void WifiSelectionActivity::render(RenderLock&&) { - // Don't render if we're in PASSWORD_ENTRY state - we're just transitioning + // Don't render if we're in a keyboard-entry state - we're just transitioning // from the keyboard subactivity back to the main activity - if (state == WifiSelectionState::PASSWORD_ENTRY) { + if (state == WifiSelectionState::PASSWORD_ENTRY || state == WifiSelectionState::HIDDEN_SSID_ENTRY) { return; } @@ -596,7 +668,7 @@ void WifiSelectionActivity::render(RenderLock&&) { // Draw header char countStr[32]; - snprintf(countStr, sizeof(countStr), tr(STR_NETWORKS_FOUND), networks.size()); + snprintf(countStr, sizeof(countStr), tr(STR_NETWORKS_FOUND), realNetworkCount); GUI.drawHeader(renderer, Rect{screen.x, screen.y + metrics.topPadding, screen.width, metrics.headerHeight}, tr(STR_WIFI_NETWORKS), countStr); GUI.drawSubHeader( @@ -614,6 +686,9 @@ void WifiSelectionActivity::render(RenderLock&&) { case WifiSelectionState::NETWORK_LIST: renderNetworkList(&screen, &metrics); break; + case WifiSelectionState::HIDDEN_SSID_ENTRY: + // Transitioning to/from the SSID keyboard subactivity - nothing to draw + break; case WifiSelectionState::CONNECTING: renderConnecting(&screen, &metrics); break; @@ -647,9 +722,17 @@ void WifiSelectionActivity::renderNetworkList(const Rect* screen, const ThemeMet int contentHeight = screen->height - contentTop - metrics->verticalSpacing * 2; GUI.drawList( renderer, Rect{screen->x, contentTop, screen->width, contentHeight}, static_cast(networks.size()), - selectedNetworkIndex, [this](int index) { return networks[index].ssid; }, nullptr, nullptr, + selectedNetworkIndex, [this](int index) { - auto network = networks[index]; + const auto& network = networks[index]; + return network.isHiddenPlaceholder ? std::string(tr(STR_ADD_HIDDEN_NETWORK)) : network.ssid; + }, + nullptr, nullptr, + [this](int index) { + const auto& network = networks[index]; + if (network.isHiddenPlaceholder) { + return std::string(); + } return std::string(network.hasSavedPassword ? "+ " : "") + (network.isEncrypted ? "* " : "") + getSignalStrengthIndicator(network.rssi); }); diff --git a/src/activities/network/WifiSelectionActivity.h b/src/activities/network/WifiSelectionActivity.h index 43eecf08..f352f493 100644 --- a/src/activities/network/WifiSelectionActivity.h +++ b/src/activities/network/WifiSelectionActivity.h @@ -18,7 +18,8 @@ struct WifiNetworkInfo { std::string ssid; int32_t rssi; bool isEncrypted; - bool hasSavedPassword; // Whether we have saved credentials for this network + bool hasSavedPassword; // Whether we have saved credentials for this network + bool isHiddenPlaceholder = false; // Synthetic "Add hidden network..." list entry }; // WiFi selection states @@ -26,6 +27,7 @@ enum class WifiSelectionState { AUTO_CONNECTING, // Trying to connect to the last known network SCANNING, // Scanning for networks NETWORK_LIST, // Displaying available networks + HIDDEN_SSID_ENTRY, // Entering SSID for a hidden network PASSWORD_ENTRY, // Entering password for selected network CONNECTING, // Attempting to connect CONNECTED, // Successfully connected @@ -51,6 +53,8 @@ class WifiSelectionActivity final : public Activity { WifiSelectionState state = WifiSelectionState::SCANNING; size_t selectedNetworkIndex = 0; std::vector networks; + // Number of real (scanned) networks, excluding the synthetic hidden-network entry + size_t realNetworkCount = 0; // Selected network for connection std::string selectedSSID; @@ -100,7 +104,10 @@ class WifiSelectionActivity final : public Activity { void startWifiScan(bool autoScan = false); void processWifiScanResults(); + void appendHiddenNetworkEntry(); void selectNetwork(int index); + void promptHiddenSsid(); + void promptPasswordEntry(); void attemptConnection(); void checkConnectionStatus(); bool tryAutoConnectCredential(const WifiCredential& cred);