diff --git a/lib/I18n/I18n.cpp b/lib/I18n/I18n.cpp index ef4a853a..82de585f 100644 --- a/lib/I18n/I18n.cpp +++ b/lib/I18n/I18n.cpp @@ -27,12 +27,10 @@ const char* I18n::get(StrId id) const { // Use generated helper function - no hardcoded switch needed! const LangStrings lang = getLanguageStrings(_language); - const char* result = lang.data + lang.offsets[index]; - if (_language != Language::EN && result[0] == '\0') { - const LangStrings english = getLanguageStrings(Language::EN); - return english.data + english.offsets[index]; - } - return result; + // If bit 15 of the offset is set, apply the offset to the English lookup table + const uint16_t off = lang.offsets[index]; + if (off & 0x8000) return STRINGS_EN_DATA + (off & 0x7FFF); + return lang.data + off; } void I18n::setLanguage(Language lang) { diff --git a/lib/I18n/translations/french.yaml b/lib/I18n/translations/french.yaml index 529475a4..35a2851f 100644 --- a/lib/I18n/translations/french.yaml +++ b/lib/I18n/translations/french.yaml @@ -542,3 +542,79 @@ STR_MENU_READER_TWEAKS: "Ajustements lecteur" STR_MENU_READER_SPACING: "Espacement" STR_MENU_KOSYNC_SERVER: "Paramètres serveur" STR_MENU_KOSYNC_AUTH: "Connexion / Inscription" + +STR_LOADING_FONT_LIST: "Chargement de la liste des polices..." +STR_FONT_DOWNLOAD: "Télécharger la police" +STR_FONT_INSTALLED: "Police installée !" +STR_FONT_INSTALL_FAILED: "Échec de l'installation de la police" +STR_MENU_KOSYNC_BEHAVIOR: "Comportement de synchronisation" +STR_KO_SYNC_ON_BOOK_CLOSE: "Envoi automatique à la fermeture du livre" +STR_KO_AUTO_SYNC_SKIPPED: "Distant en avance, passage" +STR_KO_LONGPRESS_HINT: "Maintenez Confirmer pour ouvrir avec la synchronisation" +STR_INSTALLED: "Installé" +STR_DOWNLOAD_ALL: "Tout télécharger / mettre à jour" +STR_UPDATE_AVAILABLE: "Mettre à jour" +STR_TINY: "Minuscule" +STR_NO_FONTS_AVAILABLE: "Aucune police disponible" +STR_MENU_BTN_ACTIONS: "Actions des boutons" +STR_MENU_BTN_PHYSICAL: "Boutons physiques" +STR_BTN_ACTIONS_OVERVIEW: "Aperçu des actions des boutons" +STR_BTN_OVERVIEW_HEADER_BUTTON: "Bouton" +STR_BTN_OVERVIEW_HEADER_SHORT: "Court" +STR_BTN_OVERVIEW_HEADER_DOUBLE: "Double" +STR_BTN_OVERVIEW_HEADER_LONG: "Long" +STR_BTN_SHORT_PRESS: "Appui court" +STR_BTN_DOUBLE_PRESS: "Double appui" +STR_BTN_LONG_PRESS: "Appui long" +STR_BTN_BACK: "Bouton Retour" +STR_BTN_CONFIRM: "Bouton Confirmer" +STR_BTN_LEFT: "Bouton Gauche" +STR_BTN_RIGHT: "Bouton Droit" +STR_BTN_PAGE_BACK: "Bouton Page précédente" +STR_BTN_PAGE_FORWARD: "Bouton Page suivante" +STR_BTN_POWER: "Bouton d'alimentation" +STR_BTN_ACT_DEFAULT: "Par défaut" +STR_BTN_DEF_IGNORE: "Ignorer" +STR_BTN_DEF_EXIT_READER: "Quitter le lecteur" +STR_BTN_DEF_GO_HOME: "Aller à l accueil" +STR_BTN_DEF_READER_MENU: "Menu du lecteur" +STR_BTN_DEF_KOREADER_SYNC: "Synchronisation KOReader" +STR_BTN_DEF_PREV_PAGE: "Page précédente" +STR_BTN_DEF_NEXT_PAGE: "Page suivante" +STR_BTN_DEF_CHAPTER_BACK: "Chapitre précédent" +STR_BTN_DEF_CHAPTER_FORWARD: "Chapitre suivant" +STR_BTN_DEF_SLEEP: "Veille" +STR_BTN_ACT_PAGE_FORWARD: "Page suivante" +STR_BTN_ACT_PAGE_BACK: "Page précédente" +STR_BTN_ACT_PAGE_FORWARD_10: "Sauter 10 pages en avant" +STR_BTN_ACT_PAGE_BACK_10: "Sauter 10 pages en arrière" +STR_BTN_ACT_GO_HOME: "Aller à l accueil" +STR_BTN_ACT_SLEEP: "Veille" +STR_BTN_ACT_FORCE_REFRESH: "Actualiser l'écran" +STR_BTN_ACT_FORCE_FAST_REFRESH: "Actualiser rapidement l'écran" +STR_BTN_ACT_OPEN_TOC: "Ouvrir la table des matières" +STR_BTN_ACT_OPEN_BOOKMARKS: "Ouvrir les signets" +STR_BTN_ACT_STAR_PAGE: "Marquer la page" +STR_BTN_ACT_FOOTNOTES: "Notes de bas de page" +STR_BTN_ACT_NEXT_SECTION: "Section / chapitre suivant" +STR_BTN_ACT_PREV_SECTION: "Section / chapitre précédent" +STR_BTN_ACT_EXIT_READER: "Quitter le lecteur" +STR_BTN_ACT_READER_MENU: "Menu du lecteur" +STR_BTN_ACT_KOREADER_SYNC: "Synchronisation KOReader" +STR_KB_HINT_MOVE_CURSOR: "Appuyez sur GAUCHE ou DROITE pour déplacer le curseur" +STR_KB_HINT_RETURN_CURSOR: "Appuyez sur GAUCHE pour revenir à la position du curseur" +STR_KB_HINT_HIDE_PASSWORD: "Maintenez DROITE puis appuyez sur [***] pour masquer le mot de passe" +STR_KB_HINT_SHOW_PASSWORD: "Maintenez DROITE puis appuyez sur [abc] pour afficher le mot de passe" +STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Appuyez sur [***] pour masquer le mot de passe" +STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Appuyez sur [abc] pour afficher le mot de passe" +STR_KB_HINT_EDIT_ENTRY: "Maintenez HAUT pour modifier l entrée" +STR_KB_TIPS: "Conseils :" +STR_KB_HINT_RETURN_KEYBOARD: "Appuyez sur BAS pour revenir au clavier" +STR_KB_HINT_EXIT_URL_MODE: "Appuyez sur ABC pour quitter le mode URL" +STR_KB_HINT_CLEAR_TEXT: "Maintenez DEL pour effacer tout le texte" +STR_KB_HINT_SECONDARY_CHAR: "Maintenez SELECT pour le caractère secondaire" +STR_KB_HINT_UPPER_SECONDARY: "Maintenez SELECT pour MAJUSCULE ou caractère secondaire" +STR_KB_HINT_LOWER_SECONDARY: "Maintenez SELECT pour minuscule ou caractère secondaire" +STR_KB_HINT_URL_SNIPPETS: "Appuyez sur URL pour les extraits" +STR_BIONIC_READING: "Lecture bionique" +STR_BTN_ACT_TOGGLE_BIONIC_READING: "Basculer la lecture bionique" diff --git a/lib/I18n/translations/german.yaml b/lib/I18n/translations/german.yaml index 5c5b722d..75c93bd5 100644 --- a/lib/I18n/translations/german.yaml +++ b/lib/I18n/translations/german.yaml @@ -545,3 +545,80 @@ STR_KEYBOARD_HELP_PASSWORD_LINE_3: "Entf lang drücken löscht alles." STR_KEYBOARD_HELP_DEFAULT_LINE_1: "Hoch lang drücken für Cursor-Modus; <- -> bewegt den Cursor." STR_KEYBOARD_HELP_DEFAULT_LINE_2: "Lange Bestätigen drücken für alternative Zeichen." STR_KEYBOARD_HELP_DEFAULT_LINE_3: "umsch für Groß-/Kleinschreibung" + + +STR_LOADING_FONT_LIST: "Lade Schriftartenliste..." +STR_FONT_DOWNLOAD: "Schriftart herunterladen" +STR_FONT_INSTALLED: "Schriftart installiert!" +STR_FONT_INSTALL_FAILED: "Schriftartinstallation fehlgeschlagen" +STR_MENU_KOSYNC_BEHAVIOR: "Synchronisierungsverhalten" +STR_KO_SYNC_ON_BOOK_CLOSE: "Automatischer Push bei Buchschließen" +STR_KO_AUTO_SYNC_SKIPPED: "Remote voraus, überspringe" +STR_KO_LONGPRESS_HINT: "Halte Bestätigen gedrückt, um mit Sync zu öffnen" +STR_INSTALLED: "Installiert" +STR_DOWNLOAD_ALL: "Alle herunterladen/aktualisieren" +STR_UPDATE_AVAILABLE: "Aktualisieren" +STR_TINY: "Winzig" +STR_NO_FONTS_AVAILABLE: "Keine Schriften verfügbar" +STR_MENU_BTN_ACTIONS: "Tastenaktionen" +STR_MENU_BTN_PHYSICAL: "Physische Tasten" +STR_BTN_ACTIONS_OVERVIEW: "Übersicht Tastenaktionen" +STR_BTN_OVERVIEW_HEADER_BUTTON: "Taste" +STR_BTN_OVERVIEW_HEADER_SHORT: "Kurz" +STR_BTN_OVERVIEW_HEADER_DOUBLE: "Doppelt" +STR_BTN_OVERVIEW_HEADER_LONG: "Lang" +STR_BTN_SHORT_PRESS: "Kurzer Druck" +STR_BTN_DOUBLE_PRESS: "Doppelter Druck" +STR_BTN_LONG_PRESS: "Langer Druck" +STR_BTN_BACK: "Zurück-Taste" +STR_BTN_CONFIRM: "Bestätigen-Taste" +STR_BTN_LEFT: "Linke Taste" +STR_BTN_RIGHT: "Rechte Taste" +STR_BTN_PAGE_BACK: "Seite-zurück-Taste" +STR_BTN_PAGE_FORWARD: "Seite-vorwärts-Taste" +STR_BTN_POWER: "Ein/Aus-Taste" +STR_BTN_ACT_DEFAULT: "Standard" +STR_BTN_DEF_IGNORE: "Ignorieren" +STR_BTN_DEF_EXIT_READER: "Reader beenden" +STR_BTN_DEF_GO_HOME: "Nach Hause" +STR_BTN_DEF_READER_MENU: "Reader-Menü" +STR_BTN_DEF_KOREADER_SYNC: "KOReader-Sync" +STR_BTN_DEF_PREV_PAGE: "Vorherige Seite" +STR_BTN_DEF_NEXT_PAGE: "Nächste Seite" +STR_BTN_DEF_CHAPTER_BACK: "Kapitel zurück" +STR_BTN_DEF_CHAPTER_FORWARD: "Kapitel vorwärts" +STR_BTN_DEF_SLEEP: "Standby" +STR_BTN_ACT_PAGE_FORWARD: "Nächste Seite" +STR_BTN_ACT_PAGE_BACK: "Vorherige Seite" +STR_BTN_ACT_PAGE_FORWARD_10: "Springe 10 Seiten vorwärts" +STR_BTN_ACT_PAGE_BACK_10: "Springe 10 Seiten zurück" +STR_BTN_ACT_GO_HOME: "Nach Hause" +STR_BTN_ACT_SLEEP: "Standby" +STR_BTN_ACT_FORCE_REFRESH: "Bildschirm aktualisieren" +STR_BTN_ACT_FORCE_FAST_REFRESH: "Bildschirm schnell aktualisieren" +STR_BTN_ACT_OPEN_TOC: "Inhaltsverzeichnis öffnen" +STR_BTN_ACT_OPEN_BOOKMARKS: "Lesezeichen öffnen" +STR_BTN_ACT_STAR_PAGE: "Seite markieren" +STR_BTN_ACT_FOOTNOTES: "Fußnoten" +STR_BTN_ACT_NEXT_SECTION: "Nächster Abschnitt / Kapitel" +STR_BTN_ACT_PREV_SECTION: "Vorheriger Abschnitt / Kapitel" +STR_BTN_ACT_EXIT_READER: "Reader beenden" +STR_BTN_ACT_READER_MENU: "Reader-Menü" +STR_BTN_ACT_KOREADER_SYNC: "KOReader-Sync" +STR_KB_HINT_MOVE_CURSOR: "Links oder Rechts drücken, um den Cursor zu bewegen" +STR_KB_HINT_RETURN_CURSOR: "Links drücken, um zur Cursorposition zurückzukehren" +STR_KB_HINT_HIDE_PASSWORD: "Rechts halten, dann [***] drücken, um das Passwort zu verbergen" +STR_KB_HINT_SHOW_PASSWORD: "Rechts halten, dann [abc] drücken, um das Passwort anzuzeigen" +STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "[***] drücken, um das Passwort zu verbergen" +STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "[abc] drücken, um das Passwort anzuzeigen" +STR_KB_HINT_EDIT_ENTRY: "Hoch halten, um Eintrag zu bearbeiten" +STR_KB_TIPS: "Tipps:" +STR_KB_HINT_RETURN_KEYBOARD: "Runter drücken, um zur Tastatur zurückzukehren" +STR_KB_HINT_EXIT_URL_MODE: "ABC drücken, um den URL-Modus zu verlassen" +STR_KB_HINT_CLEAR_TEXT: "DEL halten, um den gesamten Text zu löschen" +STR_KB_HINT_SECONDARY_CHAR: "SELECT halten für sekundäres Zeichen" +STR_KB_HINT_UPPER_SECONDARY: "SELECT halten für GROSSBUCHSTABE oder sekundäres Zeichen" +STR_KB_HINT_LOWER_SECONDARY: "SELECT halten für Kleinbuchstabe oder sekundäres Zeichen" +STR_KB_HINT_URL_SNIPPETS: "URL drücken für Schnipsel" +STR_BIONIC_READING: "Bionisches Lesen" +STR_BTN_ACT_TOGGLE_BIONIC_READING: "Bionisches Lesen umschalten" diff --git a/lib/I18n/translations/italian.yaml b/lib/I18n/translations/italian.yaml index add4d299..5b8e5910 100644 --- a/lib/I18n/translations/italian.yaml +++ b/lib/I18n/translations/italian.yaml @@ -543,3 +543,79 @@ STR_MENU_READER_TWEAKS: "Personalizzazioni lettore" STR_MENU_READER_SPACING: "Spaziatura" STR_MENU_KOSYNC_SERVER: "Impostazioni server" STR_MENU_KOSYNC_AUTH: "Accesso / Registrazione" + +STR_LOADING_FONT_LIST: "Caricamento elenco dei font..." +STR_FONT_DOWNLOAD: "Download del font" +STR_FONT_INSTALLED: "Font installato!" +STR_FONT_INSTALL_FAILED: "Installazione del font non riuscita" +STR_MENU_KOSYNC_BEHAVIOR: "Comportamento di sincronizzazione" +STR_KO_SYNC_ON_BOOK_CLOSE: "Invio automatico alla chiusura del libro" +STR_KO_AUTO_SYNC_SKIPPED: "Remoto in anticipo, salto" +STR_KO_LONGPRESS_HINT: "Tieni premuto Conferma per aprire con la sincronizzazione" +STR_INSTALLED: "Installato" +STR_DOWNLOAD_ALL: "Scarica / aggiorna tutto" +STR_UPDATE_AVAILABLE: "Aggiorna" +STR_TINY: "Minuscolo" +STR_NO_FONTS_AVAILABLE: "Nessun font disponibile" +STR_MENU_BTN_ACTIONS: "Azioni dei pulsanti" +STR_MENU_BTN_PHYSICAL: "Pulsanti fisici" +STR_BTN_ACTIONS_OVERVIEW: "Panoramica delle azioni dei pulsanti" +STR_BTN_OVERVIEW_HEADER_BUTTON: "Pulsante" +STR_BTN_OVERVIEW_HEADER_SHORT: "Breve" +STR_BTN_OVERVIEW_HEADER_DOUBLE: "Doppio" +STR_BTN_OVERVIEW_HEADER_LONG: "Lungo" +STR_BTN_SHORT_PRESS: "Pressione breve" +STR_BTN_DOUBLE_PRESS: "Doppia pressione" +STR_BTN_LONG_PRESS: "Pressione lunga" +STR_BTN_BACK: "Pulsante Indietro" +STR_BTN_CONFIRM: "Pulsante Conferma" +STR_BTN_LEFT: "Pulsante Sinistro" +STR_BTN_RIGHT: "Pulsante Destro" +STR_BTN_PAGE_BACK: "Pulsante Pagina indietro" +STR_BTN_PAGE_FORWARD: "Pulsante Pagina avanti" +STR_BTN_POWER: "Pulsante di accensione" +STR_BTN_ACT_DEFAULT: "Predefinito" +STR_BTN_DEF_IGNORE: "Ignora" +STR_BTN_DEF_EXIT_READER: "Esci dal lettore" +STR_BTN_DEF_GO_HOME: "Vai a home" +STR_BTN_DEF_READER_MENU: "Menu lettore" +STR_BTN_DEF_KOREADER_SYNC: "Sincronizzazione KOReader" +STR_BTN_DEF_PREV_PAGE: "Pagina precedente" +STR_BTN_DEF_NEXT_PAGE: "Pagina successiva" +STR_BTN_DEF_CHAPTER_BACK: "Capitolo precedente" +STR_BTN_DEF_CHAPTER_FORWARD: "Capitolo successivo" +STR_BTN_DEF_SLEEP: "Sospendi" +STR_BTN_ACT_PAGE_FORWARD: "Pagina successiva" +STR_BTN_ACT_PAGE_BACK: "Pagina precedente" +STR_BTN_ACT_PAGE_FORWARD_10: "Salta 10 pagine avanti" +STR_BTN_ACT_PAGE_BACK_10: "Salta 10 pagine indietro" +STR_BTN_ACT_GO_HOME: "Vai a home" +STR_BTN_ACT_SLEEP: "Sospendi" +STR_BTN_ACT_FORCE_REFRESH: "Aggiorna schermo" +STR_BTN_ACT_FORCE_FAST_REFRESH: "Aggiorna schermo rapido" +STR_BTN_ACT_OPEN_TOC: "Apri sommario" +STR_BTN_ACT_OPEN_BOOKMARKS: "Apri segnalibri" +STR_BTN_ACT_STAR_PAGE: "Aggiungi stella alla pagina" +STR_BTN_ACT_FOOTNOTES: "Note a piè di pagina" +STR_BTN_ACT_NEXT_SECTION: "Sezione / capitolo successivo" +STR_BTN_ACT_PREV_SECTION: "Sezione / capitolo precedente" +STR_BTN_ACT_EXIT_READER: "Esci dal lettore" +STR_BTN_ACT_READER_MENU: "Menu lettore" +STR_BTN_ACT_KOREADER_SYNC: "Sincronizzazione KOReader" +STR_KB_HINT_MOVE_CURSOR: "Premi SINISTRA o DESTRA per spostare il cursore" +STR_KB_HINT_RETURN_CURSOR: "Premi SINISTRA per tornare alla posizione del cursore" +STR_KB_HINT_HIDE_PASSWORD: "Tieni premuto DESTRA poi premi [***] per nascondere la password" +STR_KB_HINT_SHOW_PASSWORD: "Tieni premuto DESTRA poi premi [abc] per mostrare la password" +STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Premi [***] per nascondere la password" +STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Premi [abc] per mostrare la password" +STR_KB_HINT_EDIT_ENTRY: "Tieni premuto SU per modificare la voce" +STR_KB_TIPS: "Suggerimenti:" +STR_KB_HINT_RETURN_KEYBOARD: "Premi GIÙ per tornare alla tastiera" +STR_KB_HINT_EXIT_URL_MODE: "Premi ABC per uscire dalla modalità URL" +STR_KB_HINT_CLEAR_TEXT: "Tieni premuto DEL per cancellare tutto il testo" +STR_KB_HINT_SECONDARY_CHAR: "Tieni SELECT per il carattere secondario" +STR_KB_HINT_UPPER_SECONDARY: "Tieni SELECT per MAIUSCOLO o carattere secondario" +STR_KB_HINT_LOWER_SECONDARY: "Tieni SELECT per minuscolo o carattere secondario" +STR_KB_HINT_URL_SNIPPETS: "Premi URL per frammenti" +STR_BIONIC_READING: "Lettura bionica" +STR_BTN_ACT_TOGGLE_BIONIC_READING: "Attiva/disattiva lettura bionica" diff --git a/lib/I18n/translations/polish.yaml b/lib/I18n/translations/polish.yaml index a20c0fb8..8870b541 100644 --- a/lib/I18n/translations/polish.yaml +++ b/lib/I18n/translations/polish.yaml @@ -540,3 +540,79 @@ STR_CAPTIVE_PORTAL_DETECTED: "Wymagane logowanie" STR_CAPTIVE_PORTAL_HINT_1: "Sieć wymaga logowania przez przeglądarkę. Na innym urządzeniu," STR_CAPTIVE_PORTAL_HINT_2: "odwiedź poniższy URL, aby autoryzować, a następnie naciśnij OK." STR_CAPTIVE_PORTAL_DONE: "Jestem autoryzowany" + +STR_LOADING_FONT_LIST: "Ładowanie listy czcionek..." +STR_FONT_DOWNLOAD: "Pobieranie czcionki" +STR_FONT_INSTALLED: "Czcionka zainstalowana!" +STR_FONT_INSTALL_FAILED: "Instalacja czcionki nie powiodła się" +STR_MENU_KOSYNC_BEHAVIOR: "Zachowanie synchronizacji" +STR_KO_SYNC_ON_BOOK_CLOSE: "Automatyczne wysyłanie przy zamknięciu książki" +STR_KO_AUTO_SYNC_SKIPPED: "Zdalny wcześniej, pomijam" +STR_KO_LONGPRESS_HINT: "Przytrzymaj Potwierdź, aby otworzyć z synchronizacją" +STR_INSTALLED: "Zainstalowano" +STR_DOWNLOAD_ALL: "Pobierz / zaktualizuj wszystko" +STR_UPDATE_AVAILABLE: "Aktualizuj" +STR_TINY: "Maleńki" +STR_NO_FONTS_AVAILABLE: "Brak dostępnych czcionek" +STR_MENU_BTN_ACTIONS: "Akcje przycisków" +STR_MENU_BTN_PHYSICAL: "Przyciski fizyczne" +STR_BTN_ACTIONS_OVERVIEW: "Przegląd akcji przycisków" +STR_BTN_OVERVIEW_HEADER_BUTTON: "Przycisk" +STR_BTN_OVERVIEW_HEADER_SHORT: "Krótki" +STR_BTN_OVERVIEW_HEADER_DOUBLE: "Podwójny" +STR_BTN_OVERVIEW_HEADER_LONG: "Długi" +STR_BTN_SHORT_PRESS: "Krótkie naciśnięcie" +STR_BTN_DOUBLE_PRESS: "Podwójne naciśnięcie" +STR_BTN_LONG_PRESS: "Długie naciśnięcie" +STR_BTN_BACK: "Przycisk Wstecz" +STR_BTN_CONFIRM: "Przycisk Potwierdź" +STR_BTN_LEFT: "Przycisk Lewo" +STR_BTN_RIGHT: "Przycisk Prawo" +STR_BTN_PAGE_BACK: "Przycisk Strona wstecz" +STR_BTN_PAGE_FORWARD: "Przycisk Strona naprzód" +STR_BTN_POWER: "Przycisk zasilania" +STR_BTN_ACT_DEFAULT: "Domyślny" +STR_BTN_DEF_IGNORE: "Ignoruj" +STR_BTN_DEF_EXIT_READER: "Wyjdź z czytnika" +STR_BTN_DEF_GO_HOME: "Idź do ekranu głównego" +STR_BTN_DEF_READER_MENU: "Menu czytnika" +STR_BTN_DEF_KOREADER_SYNC: "Synchronizacja KOReader" +STR_BTN_DEF_PREV_PAGE: "Poprzednia strona" +STR_BTN_DEF_NEXT_PAGE: "Następna strona" +STR_BTN_DEF_CHAPTER_BACK: "Rozdział wstecz" +STR_BTN_DEF_CHAPTER_FORWARD: "Rozdział naprzód" +STR_BTN_DEF_SLEEP: "Uśpij" +STR_BTN_ACT_PAGE_FORWARD: "Następna strona" +STR_BTN_ACT_PAGE_BACK: "Poprzednia strona" +STR_BTN_ACT_PAGE_FORWARD_10: "Przejdź 10 stron do przodu" +STR_BTN_ACT_PAGE_BACK_10: "Przejdź 10 stron do tyłu" +STR_BTN_ACT_GO_HOME: "Idź do ekranu głównego" +STR_BTN_ACT_SLEEP: "Uśpij" +STR_BTN_ACT_FORCE_REFRESH: "Odśwież ekran" +STR_BTN_ACT_FORCE_FAST_REFRESH: "Szybko odśwież ekran" +STR_BTN_ACT_OPEN_TOC: "Otwórz spis treści" +STR_BTN_ACT_OPEN_BOOKMARKS: "Otwórz zakładki" +STR_BTN_ACT_STAR_PAGE: "Oznacz stronę" +STR_BTN_ACT_FOOTNOTES: "Przypisy" +STR_BTN_ACT_NEXT_SECTION: "Następna sekcja / rozdział" +STR_BTN_ACT_PREV_SECTION: "Poprzednia sekcja / rozdział" +STR_BTN_ACT_EXIT_READER: "Wyjdź z czytnika" +STR_BTN_ACT_READER_MENU: "Menu czytnika" +STR_BTN_ACT_KOREADER_SYNC: "Synchronizacja KOReader" +STR_KB_HINT_MOVE_CURSOR: "Naciśnij LEWO lub PRAWO, aby przesunąć kursor" +STR_KB_HINT_RETURN_CURSOR: "Naciśnij LEWO, aby wrócić do pozycji kursora" +STR_KB_HINT_HIDE_PASSWORD: "Przytrzymaj PRAWO, potem naciśnij [***], aby ukryć hasło" +STR_KB_HINT_SHOW_PASSWORD: "Przytrzymaj PRAWO, potem naciśnij [abc], aby pokazać hasło" +STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Naciśnij [***], aby ukryć hasło" +STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Naciśnij [abc], aby pokazać hasło" +STR_KB_HINT_EDIT_ENTRY: "Przytrzymaj GÓRA, aby edytować wpis" +STR_KB_TIPS: "Wskazówki:" +STR_KB_HINT_RETURN_KEYBOARD: "Naciśnij DÓŁ, aby wrócić do klawiatury" +STR_KB_HINT_EXIT_URL_MODE: "Naciśnij ABC, aby wyjść z trybu URL" +STR_KB_HINT_CLEAR_TEXT: "Przytrzymaj DEL, aby wyczyścić cały tekst" +STR_KB_HINT_SECONDARY_CHAR: "Przytrzymaj SELECT, aby wpisać znak dodatkowy" +STR_KB_HINT_UPPER_SECONDARY: "Przytrzymaj SELECT dla WIELKIEJ lub znaku dodatkowego" +STR_KB_HINT_LOWER_SECONDARY: "Przytrzymaj SELECT dla małej lub znaku dodatkowego" +STR_KB_HINT_URL_SNIPPETS: "Naciśnij URL, aby uzyskać fragmenty" +STR_BIONIC_READING: "Bioniczne czytanie" +STR_BTN_ACT_TOGGLE_BIONIC_READING: "Przełącz bioniczne czytanie" diff --git a/lib/I18n/translations/portuguese_br.yaml b/lib/I18n/translations/portuguese_br.yaml index 366f1210..bdfc8757 100644 --- a/lib/I18n/translations/portuguese_br.yaml +++ b/lib/I18n/translations/portuguese_br.yaml @@ -541,3 +541,79 @@ STR_WEATHER_DESC_THUNDERSTORM: "Tempestade" STR_WEATHER_DESC_THUNDERSTORM_HAIL: "Tempestade com granizo" STR_WEATHER_DESC_THUNDERSTORM_HEAVY_HAIL: "Tempestade com granizo forte" STR_WEATHER_DESC_UNKNOWN: "Desconhecido" + +STR_LOADING_FONT_LIST: "Carregando lista de fontes..." +STR_FONT_DOWNLOAD: "Download de fonte" +STR_FONT_INSTALLED: "Fonte instalada!" +STR_FONT_INSTALL_FAILED: "Falha na instalação da fonte" +STR_MENU_KOSYNC_BEHAVIOR: "Comportamento de sincronização" +STR_KO_SYNC_ON_BOOK_CLOSE: "Envio automático ao fechar o livro" +STR_KO_AUTO_SYNC_SKIPPED: "Remoto à frente, pulando" +STR_KO_LONGPRESS_HINT: "Segure Confirmar para abrir com sincronização" +STR_INSTALLED: "Instalado" +STR_DOWNLOAD_ALL: "Baixar / atualizar tudo" +STR_UPDATE_AVAILABLE: "Atualizar" +STR_TINY: "Minúsculo" +STR_NO_FONTS_AVAILABLE: "Nenhuma fonte disponível" +STR_MENU_BTN_ACTIONS: "Ações de botões" +STR_MENU_BTN_PHYSICAL: "Botões físicos" +STR_BTN_ACTIONS_OVERVIEW: "Visão geral das ações dos botões" +STR_BTN_OVERVIEW_HEADER_BUTTON: "Botão" +STR_BTN_OVERVIEW_HEADER_SHORT: "Curto" +STR_BTN_OVERVIEW_HEADER_DOUBLE: "Duplo" +STR_BTN_OVERVIEW_HEADER_LONG: "Longo" +STR_BTN_SHORT_PRESS: "Toque curto" +STR_BTN_DOUBLE_PRESS: "Toque duplo" +STR_BTN_LONG_PRESS: "Toque longo" +STR_BTN_BACK: "Botão Voltar" +STR_BTN_CONFIRM: "Botão Confirmar" +STR_BTN_LEFT: "Botão Esquerdo" +STR_BTN_RIGHT: "Botão Direito" +STR_BTN_PAGE_BACK: "Botão Página anterior" +STR_BTN_PAGE_FORWARD: "Botão Página seguinte" +STR_BTN_POWER: "Botão de energia" +STR_BTN_ACT_DEFAULT: "Padrão" +STR_BTN_DEF_IGNORE: "Ignorar" +STR_BTN_DEF_EXIT_READER: "Sair do leitor" +STR_BTN_DEF_GO_HOME: "Ir para início" +STR_BTN_DEF_READER_MENU: "Menu do leitor" +STR_BTN_DEF_KOREADER_SYNC: "Sincronização KOReader" +STR_BTN_DEF_PREV_PAGE: "Página anterior" +STR_BTN_DEF_NEXT_PAGE: "Página seguinte" +STR_BTN_DEF_CHAPTER_BACK: "Capítulo anterior" +STR_BTN_DEF_CHAPTER_FORWARD: "Capítulo seguinte" +STR_BTN_DEF_SLEEP: "Suspender" +STR_BTN_ACT_PAGE_FORWARD: "Página seguinte" +STR_BTN_ACT_PAGE_BACK: "Página anterior" +STR_BTN_ACT_PAGE_FORWARD_10: "Pular 10 páginas à frente" +STR_BTN_ACT_PAGE_BACK_10: "Pular 10 páginas atrás" +STR_BTN_ACT_GO_HOME: "Ir para início" +STR_BTN_ACT_SLEEP: "Suspender" +STR_BTN_ACT_FORCE_REFRESH: "Atualizar tela" +STR_BTN_ACT_FORCE_FAST_REFRESH: "Atualizar tela rápido" +STR_BTN_ACT_OPEN_TOC: "Abrir índice" +STR_BTN_ACT_OPEN_BOOKMARKS: "Abrir favoritos" +STR_BTN_ACT_STAR_PAGE: "Assinalar página" +STR_BTN_ACT_FOOTNOTES: "Notas de rodapé" +STR_BTN_ACT_NEXT_SECTION: "Próxima seção / capítulo" +STR_BTN_ACT_PREV_SECTION: "Seção / capítulo anterior" +STR_BTN_ACT_EXIT_READER: "Sair do leitor" +STR_BTN_ACT_READER_MENU: "Menu do leitor" +STR_BTN_ACT_KOREADER_SYNC: "Sincronização KOReader" +STR_KB_HINT_MOVE_CURSOR: "Pressione ESQUERDA ou DIREITA para mover o cursor" +STR_KB_HINT_RETURN_CURSOR: "Pressione ESQUERDA para voltar à posição do cursor" +STR_KB_HINT_HIDE_PASSWORD: "Segure DIREITA e pressione [***] para ocultar a senha" +STR_KB_HINT_SHOW_PASSWORD: "Segure DIREITA e pressione [abc] para mostrar a senha" +STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Pressione [***] para ocultar a senha" +STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Pressione [abc] para mostrar a senha" +STR_KB_HINT_EDIT_ENTRY: "Segure CIMA para editar a entrada" +STR_KB_TIPS: "Dicas:" +STR_KB_HINT_RETURN_KEYBOARD: "Pressione BAIXO para voltar ao teclado" +STR_KB_HINT_EXIT_URL_MODE: "Pressione ABC para sair do modo URL" +STR_KB_HINT_CLEAR_TEXT: "Segure DEL para limpar todo o texto" +STR_KB_HINT_SECONDARY_CHAR: "Segure SELECT para caractere secundário" +STR_KB_HINT_UPPER_SECONDARY: "Segure SELECT para MAIÚSCULA ou caractere secundário" +STR_KB_HINT_LOWER_SECONDARY: "Segure SELECT para minúscula ou caractere secundário" +STR_KB_HINT_URL_SNIPPETS: "Pressione URL para snippets" +STR_BIONIC_READING: "Leitura biónica" +STR_BTN_ACT_TOGGLE_BIONIC_READING: "Alternar leitura biónica" diff --git a/lib/I18n/translations/portuguese_pt.yaml b/lib/I18n/translations/portuguese_pt.yaml index 1394e0d9..db0b0ba0 100644 --- a/lib/I18n/translations/portuguese_pt.yaml +++ b/lib/I18n/translations/portuguese_pt.yaml @@ -540,3 +540,79 @@ STR_CAPTIVE_PORTAL_DETECTED: "Login necessário" STR_CAPTIVE_PORTAL_HINT_1: "A rede requer login no navegador. Noutro dispositivo," STR_CAPTIVE_PORTAL_HINT_2: "visite o URL abaixo para autorizar e depois pressione OK." STR_CAPTIVE_PORTAL_DONE: "Estou autorizado" + +STR_LOADING_FONT_LIST: "A carregar lista de fontes..." +STR_FONT_DOWNLOAD: "Transferência de fonte" +STR_FONT_INSTALLED: "Fonte instalada!" +STR_FONT_INSTALL_FAILED: "Falha na instalação da fonte" +STR_MENU_KOSYNC_BEHAVIOR: "Comportamento de sincronização" +STR_KO_SYNC_ON_BOOK_CLOSE: "Envio automático ao fechar o livro" +STR_KO_AUTO_SYNC_SKIPPED: "Remoto à frente, a ignorar" +STR_KO_LONGPRESS_HINT: "Mantenha Confirmar para abrir com sincronização" +STR_INSTALLED: "Instalado" +STR_DOWNLOAD_ALL: "Transferir / atualizar tudo" +STR_UPDATE_AVAILABLE: "Atualizar" +STR_TINY: "Minúsculo" +STR_NO_FONTS_AVAILABLE: "Nenhuma fonte disponível" +STR_MENU_BTN_ACTIONS: "Ações de botões" +STR_MENU_BTN_PHYSICAL: "Botões físicos" +STR_BTN_ACTIONS_OVERVIEW: "Visão geral das ações de botões" +STR_BTN_OVERVIEW_HEADER_BUTTON: "Botão" +STR_BTN_OVERVIEW_HEADER_SHORT: "Curto" +STR_BTN_OVERVIEW_HEADER_DOUBLE: "Duplo" +STR_BTN_OVERVIEW_HEADER_LONG: "Longo" +STR_BTN_SHORT_PRESS: "Pressão curta" +STR_BTN_DOUBLE_PRESS: "Pressão dupla" +STR_BTN_LONG_PRESS: "Pressão longa" +STR_BTN_BACK: "Botão Voltar" +STR_BTN_CONFIRM: "Botão Confirmar" +STR_BTN_LEFT: "Botão Esquerdo" +STR_BTN_RIGHT: "Botão Direito" +STR_BTN_PAGE_BACK: "Botão Página atrás" +STR_BTN_PAGE_FORWARD: "Botão Página à frente" +STR_BTN_POWER: "Botão de energia" +STR_BTN_ACT_DEFAULT: "Predefinido" +STR_BTN_DEF_IGNORE: "Ignorar" +STR_BTN_DEF_EXIT_READER: "Sair do leitor" +STR_BTN_DEF_GO_HOME: "Ir para início" +STR_BTN_DEF_READER_MENU: "Menu do leitor" +STR_BTN_DEF_KOREADER_SYNC: "Sincronização KOReader" +STR_BTN_DEF_PREV_PAGE: "Página anterior" +STR_BTN_DEF_NEXT_PAGE: "Página seguinte" +STR_BTN_DEF_CHAPTER_BACK: "Capítulo anterior" +STR_BTN_DEF_CHAPTER_FORWARD: "Capítulo seguinte" +STR_BTN_DEF_SLEEP: "Suspender" +STR_BTN_ACT_PAGE_FORWARD: "Página seguinte" +STR_BTN_ACT_PAGE_BACK: "Página anterior" +STR_BTN_ACT_PAGE_FORWARD_10: "Pular 10 páginas à frente" +STR_BTN_ACT_PAGE_BACK_10: "Pular 10 páginas atrás" +STR_BTN_ACT_GO_HOME: "Ir para início" +STR_BTN_ACT_SLEEP: "Suspender" +STR_BTN_ACT_FORCE_REFRESH: "Atualizar ecrã" +STR_BTN_ACT_FORCE_FAST_REFRESH: "Atualizar ecrã rápido" +STR_BTN_ACT_OPEN_TOC: "Abrir índice" +STR_BTN_ACT_OPEN_BOOKMARKS: "Abrir favoritos" +STR_BTN_ACT_STAR_PAGE: "Assinalar página" +STR_BTN_ACT_FOOTNOTES: "Notas de rodapé" +STR_BTN_ACT_NEXT_SECTION: "Próxima secção / capítulo" +STR_BTN_ACT_PREV_SECTION: "Secção / capítulo anterior" +STR_BTN_ACT_EXIT_READER: "Sair do leitor" +STR_BTN_ACT_READER_MENU: "Menu do leitor" +STR_BTN_ACT_KOREADER_SYNC: "Sincronização KOReader" +STR_KB_HINT_MOVE_CURSOR: "Prima ESQUERDA ou DIREITA para mover o cursor" +STR_KB_HINT_RETURN_CURSOR: "Prima ESQUERDA para voltar à posição do cursor" +STR_KB_HINT_HIDE_PASSWORD: "Mantenha DIREITA e prima [***] para ocultar a senha" +STR_KB_HINT_SHOW_PASSWORD: "Mantenha DIREITA e prima [abc] para mostrar a senha" +STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Prima [***] para ocultar a senha" +STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Prima [abc] para mostrar a senha" +STR_KB_HINT_EDIT_ENTRY: "Mantenha CIMA para editar a entrada" +STR_KB_TIPS: "Sugestões:" +STR_KB_HINT_RETURN_KEYBOARD: "Prima BAIXO para voltar ao teclado" +STR_KB_HINT_EXIT_URL_MODE: "Prima ABC para sair do modo URL" +STR_KB_HINT_CLEAR_TEXT: "Mantenha DEL para limpar todo o texto" +STR_KB_HINT_SECONDARY_CHAR: "Mantenha SELECT para caractere secundário" +STR_KB_HINT_UPPER_SECONDARY: "Mantenha SELECT para MAIÚSCULA ou caractere secundário" +STR_KB_HINT_LOWER_SECONDARY: "Mantenha SELECT para minúscula ou caractere secundário" +STR_KB_HINT_URL_SNIPPETS: "Prima URL para snippets" +STR_BIONIC_READING: "Leitura biónica" +STR_BTN_ACT_TOGGLE_BIONIC_READING: "Alternar leitura biónica" diff --git a/lib/I18n/translations/russian.yaml b/lib/I18n/translations/russian.yaml index a8779835..5a36b142 100644 --- a/lib/I18n/translations/russian.yaml +++ b/lib/I18n/translations/russian.yaml @@ -542,3 +542,79 @@ STR_MENU_READER_TWEAKS: "Параметры чтения" STR_MENU_READER_SPACING: "Интервал" STR_MENU_KOSYNC_SERVER: "Настройки сервера" STR_MENU_KOSYNC_AUTH: "Вход / Регистрация" + +STR_LOADING_FONT_LIST: "Загрузка списка шрифтов..." +STR_FONT_DOWNLOAD: "Загрузка шрифта" +STR_FONT_INSTALLED: "Шрифт установлен!" +STR_FONT_INSTALL_FAILED: "Не удалось установить шрифт" +STR_MENU_KOSYNC_BEHAVIOR: "Поведение синхронизации" +STR_KO_SYNC_ON_BOOK_CLOSE: "Авто-отправка при закрытии книги" +STR_KO_AUTO_SYNC_SKIPPED: "Удаленный впереди, пропускаю" +STR_KO_LONGPRESS_HINT: "Удерживайте Подтвердить, чтобы открыть с синхронизацией" +STR_INSTALLED: "Установлено" +STR_DOWNLOAD_ALL: "Загрузить / обновить все" +STR_UPDATE_AVAILABLE: "Обновить" +STR_TINY: "Крошечный" +STR_NO_FONTS_AVAILABLE: "Шрифты недоступны" +STR_MENU_BTN_ACTIONS: "Действия кнопок" +STR_MENU_BTN_PHYSICAL: "Физические кнопки" +STR_BTN_ACTIONS_OVERVIEW: "Обзор действий кнопок" +STR_BTN_OVERVIEW_HEADER_BUTTON: "Кнопка" +STR_BTN_OVERVIEW_HEADER_SHORT: "Короткое" +STR_BTN_OVERVIEW_HEADER_DOUBLE: "Двойное" +STR_BTN_OVERVIEW_HEADER_LONG: "Долгое" +STR_BTN_SHORT_PRESS: "Короткое нажатие" +STR_BTN_DOUBLE_PRESS: "Двойное нажатие" +STR_BTN_LONG_PRESS: "Долгое нажатие" +STR_BTN_BACK: "Кнопка Назад" +STR_BTN_CONFIRM: "Кнопка Подтвердить" +STR_BTN_LEFT: "Кнопка Влево" +STR_BTN_RIGHT: "Кнопка Вправо" +STR_BTN_PAGE_BACK: "Кнопка Страница назад" +STR_BTN_PAGE_FORWARD: "Кнопка Страница вперед" +STR_BTN_POWER: "Кнопка питания" +STR_BTN_ACT_DEFAULT: "По умолчанию" +STR_BTN_DEF_IGNORE: "Игнорировать" +STR_BTN_DEF_EXIT_READER: "Выйти из ридера" +STR_BTN_DEF_GO_HOME: "На главную" +STR_BTN_DEF_READER_MENU: "Меню ридера" +STR_BTN_DEF_KOREADER_SYNC: "Синхронизация KOReader" +STR_BTN_DEF_PREV_PAGE: "Предыдущая страница" +STR_BTN_DEF_NEXT_PAGE: "Следующая страница" +STR_BTN_DEF_CHAPTER_BACK: "Глава назад" +STR_BTN_DEF_CHAPTER_FORWARD: "Глава вперед" +STR_BTN_DEF_SLEEP: "Сон" +STR_BTN_ACT_PAGE_FORWARD: "Следующая страница" +STR_BTN_ACT_PAGE_BACK: "Предыдущая страница" +STR_BTN_ACT_PAGE_FORWARD_10: "Пропустить 10 страниц вперед" +STR_BTN_ACT_PAGE_BACK_10: "Пропустить 10 страниц назад" +STR_BTN_ACT_GO_HOME: "На главную" +STR_BTN_ACT_SLEEP: "Сон" +STR_BTN_ACT_FORCE_REFRESH: "Обновить экран" +STR_BTN_ACT_FORCE_FAST_REFRESH: "Быстро обновить экран" +STR_BTN_ACT_OPEN_TOC: "Открыть оглавление" +STR_BTN_ACT_OPEN_BOOKMARKS: "Открыть закладки" +STR_BTN_ACT_STAR_PAGE: "Пометить страницу" +STR_BTN_ACT_FOOTNOTES: "Сноски" +STR_BTN_ACT_NEXT_SECTION: "Следующий раздел / глава" +STR_BTN_ACT_PREV_SECTION: "Предыдущий раздел / глава" +STR_BTN_ACT_EXIT_READER: "Выйти из ридера" +STR_BTN_ACT_READER_MENU: "Меню ридера" +STR_BTN_ACT_KOREADER_SYNC: "Синхронизация KOReader" +STR_KB_HINT_MOVE_CURSOR: "Нажмите ВЛЕВО или ВПРАВО, чтобы переместить курсор" +STR_KB_HINT_RETURN_CURSOR: "Нажмите ВЛЕВО, чтобы вернуться к позиции курсора" +STR_KB_HINT_HIDE_PASSWORD: "Удерживайте ВПРАВО, затем нажмите [***], чтобы скрыть пароль" +STR_KB_HINT_SHOW_PASSWORD: "Удерживайте ВПРАВО, затем нажмите [abc], чтобы показать пароль" +STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Нажмите [***], чтобы скрыть пароль" +STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Нажмите [abc], чтобы показать пароль" +STR_KB_HINT_EDIT_ENTRY: "Удерживайте ВВЕРХ, чтобы редактировать запись" +STR_KB_TIPS: "Советы:" +STR_KB_HINT_RETURN_KEYBOARD: "Нажмите ВНИЗ, чтобы вернуться к клавиатуре" +STR_KB_HINT_EXIT_URL_MODE: "Нажмите ABC, чтобы выйти из режима URL" +STR_KB_HINT_CLEAR_TEXT: "Удерживайте DEL, чтобы очистить весь текст" +STR_KB_HINT_SECONDARY_CHAR: "Удерживайте SELECT для вторичного символа" +STR_KB_HINT_UPPER_SECONDARY: "Удерживайте SELECT для ЗАГЛАВНОЙ или вторичного символа" +STR_KB_HINT_LOWER_SECONDARY: "Удерживайте SELECT для строчной или вторичного символа" +STR_KB_HINT_URL_SNIPPETS: "Нажмите URL для фрагментов" +STR_BIONIC_READING: "Бионическое чтение" +STR_BTN_ACT_TOGGLE_BIONIC_READING: "Переключить бионическое чтение" diff --git a/lib/I18n/translations/spanish.yaml b/lib/I18n/translations/spanish.yaml index 397ca2e4..b477b532 100644 --- a/lib/I18n/translations/spanish.yaml +++ b/lib/I18n/translations/spanish.yaml @@ -542,3 +542,79 @@ STR_MENU_READER_TWEAKS: "Ajustes de lectura" STR_MENU_READER_SPACING: "Espaciado" STR_MENU_KOSYNC_SERVER: "Ajustes del servidor" STR_MENU_KOSYNC_AUTH: "Iniciar sesión / Registrarse" + +STR_LOADING_FONT_LIST: "Cargando lista de fuentes..." +STR_FONT_DOWNLOAD: "Descarga de fuente" +STR_FONT_INSTALLED: "¡Fuente instalada!" +STR_FONT_INSTALL_FAILED: "Error al instalar la fuente" +STR_MENU_KOSYNC_BEHAVIOR: "Comportamiento de sincronización" +STR_KO_SYNC_ON_BOOK_CLOSE: "Empuje automático al cerrar el libro" +STR_KO_AUTO_SYNC_SKIPPED: "Remoto adelantado, omitiendo" +STR_KO_LONGPRESS_HINT: "Mantén pulsado Confirmar para abrir con sincronización" +STR_INSTALLED: "Instalado" +STR_DOWNLOAD_ALL: "Descargar / actualizar todo" +STR_UPDATE_AVAILABLE: "Actualizar" +STR_TINY: "Minúsculo" +STR_NO_FONTS_AVAILABLE: "No hay fuentes disponibles" +STR_MENU_BTN_ACTIONS: "Acciones de botones" +STR_MENU_BTN_PHYSICAL: "Botones físicos" +STR_BTN_ACTIONS_OVERVIEW: "Resumen de acciones de botones" +STR_BTN_OVERVIEW_HEADER_BUTTON: "Botón" +STR_BTN_OVERVIEW_HEADER_SHORT: "Corto" +STR_BTN_OVERVIEW_HEADER_DOUBLE: "Doble" +STR_BTN_OVERVIEW_HEADER_LONG: "Largo" +STR_BTN_SHORT_PRESS: "Pulsación corta" +STR_BTN_DOUBLE_PRESS: "Pulsación doble" +STR_BTN_LONG_PRESS: "Pulsación larga" +STR_BTN_BACK: "Botón Atrás" +STR_BTN_CONFIRM: "Botón Confirmar" +STR_BTN_LEFT: "Botón Izquierda" +STR_BTN_RIGHT: "Botón Derecha" +STR_BTN_PAGE_BACK: "Botón Página atrás" +STR_BTN_PAGE_FORWARD: "Botón Página adelante" +STR_BTN_POWER: "Botón de encendido" +STR_BTN_ACT_DEFAULT: "Predeterminado" +STR_BTN_DEF_IGNORE: "Ignorar" +STR_BTN_DEF_EXIT_READER: "Salir del lector" +STR_BTN_DEF_GO_HOME: "Ir a inicio" +STR_BTN_DEF_READER_MENU: "Menú del lector" +STR_BTN_DEF_KOREADER_SYNC: "Sincronización KOReader" +STR_BTN_DEF_PREV_PAGE: "Página anterior" +STR_BTN_DEF_NEXT_PAGE: "Página siguiente" +STR_BTN_DEF_CHAPTER_BACK: "Capítulo anterior" +STR_BTN_DEF_CHAPTER_FORWARD: "Capítulo siguiente" +STR_BTN_DEF_SLEEP: "Suspender" +STR_BTN_ACT_PAGE_FORWARD: "Página siguiente" +STR_BTN_ACT_PAGE_BACK: "Página anterior" +STR_BTN_ACT_PAGE_FORWARD_10: "Saltar 10 páginas adelante" +STR_BTN_ACT_PAGE_BACK_10: "Saltar 10 páginas atrás" +STR_BTN_ACT_GO_HOME: "Ir a inicio" +STR_BTN_ACT_SLEEP: "Suspender" +STR_BTN_ACT_FORCE_REFRESH: "Actualizar pantalla" +STR_BTN_ACT_FORCE_FAST_REFRESH: "Actualizar pantalla rápido" +STR_BTN_ACT_OPEN_TOC: "Abrir tabla de contenidos" +STR_BTN_ACT_OPEN_BOOKMARKS: "Abrir marcadores" +STR_BTN_ACT_STAR_PAGE: "Marcar página" +STR_BTN_ACT_FOOTNOTES: "Notas al pie" +STR_BTN_ACT_NEXT_SECTION: "Siguiente sección / capítulo" +STR_BTN_ACT_PREV_SECTION: "Sección / capítulo anterior" +STR_BTN_ACT_EXIT_READER: "Salir del lector" +STR_BTN_ACT_READER_MENU: "Menú del lector" +STR_BTN_ACT_KOREADER_SYNC: "Sincronización KOReader" +STR_KB_HINT_MOVE_CURSOR: "Presiona IZQUIERDA o DERECHA para mover el cursor" +STR_KB_HINT_RETURN_CURSOR: "Presiona IZQUIERDA para volver a la posición del cursor" +STR_KB_HINT_HIDE_PASSWORD: "Mantén pulsado DERECHA luego presiona [***] para ocultar la contraseña" +STR_KB_HINT_SHOW_PASSWORD: "Mantén pulsado DERECHA luego presiona [abc] para mostrar la contraseña" +STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Presiona [***] para ocultar la contraseña" +STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Presiona [abc] para mostrar la contraseña" +STR_KB_HINT_EDIT_ENTRY: "Mantén pulsado ARRIBA para editar la entrada" +STR_KB_TIPS: "Consejos:" +STR_KB_HINT_RETURN_KEYBOARD: "Presiona ABAJO para volver al teclado" +STR_KB_HINT_EXIT_URL_MODE: "Presiona ABC para salir del modo URL" +STR_KB_HINT_CLEAR_TEXT: "Mantén pulsado DEL para borrar todo el texto" +STR_KB_HINT_SECONDARY_CHAR: "Mantén SELECT para carácter secundario" +STR_KB_HINT_UPPER_SECONDARY: "Mantén SELECT para MAYÚSCULA o carácter secundario" +STR_KB_HINT_LOWER_SECONDARY: "Mantén SELECT para minúscula o carácter secundario" +STR_KB_HINT_URL_SNIPPETS: "Presiona URL para fragmentos" +STR_BIONIC_READING: "Lectura biónica" +STR_BTN_ACT_TOGGLE_BIONIC_READING: "Alternar lectura biónica" diff --git a/scripts/gen_i18n.py b/scripts/gen_i18n.py index 7e589988..bfcb6e29 100755 --- a/scripts/gen_i18n.py +++ b/scripts/gen_i18n.py @@ -206,36 +206,21 @@ def load_translations( if not re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", key): raise ValueError(f"Invalid C++ identifier in English file: '{key}'") - # Build translations dict, filling missing keys from English. - # Non-English values that are absent or blank fall back to English at runtime. - # A literal empty string in a non-English YAML file is treated as an intentional - # empty translation and stored as a single space to distinguish it from fallback. + # Build translations dict, filling missing keys from English inherited_sets: List[Set[str]] = [set() for _ in ordered_files] translations: Dict[str, List[str]] = {} for key in string_keys: row: List[str] = [] for lang_idx, fname in enumerate(ordered_files): data = parsed[fname] - if key not in data: - value = "" - if fname != english_file: - inherited_sets[lang_idx].add(key) - if verbose: - print( - f" INFO: '{key}' missing in {language_codes[lang_idx]}, using English fallback" - ) - else: - value = data[key] - if fname != english_file: - if value == "": - value = " " - elif not value.strip(): - value = "" - inherited_sets[lang_idx].add(key) - if verbose: - print( - f" INFO: '{key}' missing in {language_codes[lang_idx]}, using English fallback" - ) + value = data.get(key, "") + if not value.strip() and fname != english_file: + value = english_data[key] + inherited_sets[lang_idx].add(key) + if verbose: + print( + f" INFO: '{key}' missing in {language_codes[lang_idx]}, using English fallback" + ) row.append(value) translations[key] = row @@ -458,7 +443,11 @@ def format_cpp_string_literal(segments: List[str], indent: str = " ") -> List last_space = idx # Handle escapes to step correctly - idx += 2 if current[idx] == "\\" else 1 + if current[idx] == "\\": + idx += 2 + else: + idx += 1 + # If we found a space, split after it if last_space != -1: # Include the space in the first line @@ -489,12 +478,8 @@ def format_cpp_string_literal(segments: List[str], indent: str = " ") -> List def compute_character_set(translations: Dict[str, List[str]], lang_index: int) -> str: """Return a sorted string of every unique character used in a language.""" chars = set() - english_index = 0 for values in translations.values(): - text = values[lang_index] - if lang_index != english_index and text == "": - text = values[english_index] - for ch in text: + for ch in values[lang_index]: chars.add(ord(ch)) return "".join(chr(cp) for cp in sorted(chars)) @@ -524,19 +509,17 @@ def generate_keys_header( ] for code in languages: - lines.extend( - ( - f"extern const char STRINGS_{code}_DATA[];", - f"extern const uint16_t OFFSETS_{code}[];", - ) - ) + lines.append(f"extern const char STRINGS_{code}_DATA[];") + lines.append(f"extern const uint16_t OFFSETS_{code}[];") + lines.append("} // namespace i18n_strings") lines.append("") # Language enum lines.append("// Language enum") lines.append("enum class Language : uint8_t {") - lines.extend(f" {lang} = {i}," for i, lang in enumerate(languages)) + for i, lang in enumerate(languages): + lines.append(f" {lang} = {i},") lines.append(" _COUNT") lines.append("};") lines.append("") @@ -576,11 +559,9 @@ def generate_keys_header( lines.append("inline LangStrings getLanguageStrings(Language lang) {") lines.append(" switch (lang) {") for code in languages: - lines.extend( - ( - f" case Language::{code}:", - f" return {{i18n_strings::STRINGS_{code}_DATA, i18n_strings::OFFSETS_{code}}};", - ) + lines.append(f" case Language::{code}:") + lines.append( + f" return {{i18n_strings::STRINGS_{code}_DATA, i18n_strings::OFFSETS_{code}}};" ) first_code = languages[0] lines.append(" default:") @@ -608,10 +589,8 @@ def generate_keys_header( ) sorted_indices = [english_idx] + rest lines.append("// Sorted language indices by code (auto-generated by gen_i18n.py)") - lines.extend( - f"// {rank:>2}: {languages[idx]:<4} {language_names[idx]}" - for rank, idx in enumerate(sorted_indices) - ) + for rank, idx in enumerate(sorted_indices): + lines.append(f"// {rank:>2}: {languages[idx]:<4} {language_names[idx]}") lines.append( "constexpr uint8_t SORTED_LANGUAGE_INDICES[] = {" f"{', '.join(str(i) for i in sorted_indices)}" @@ -622,6 +601,23 @@ def generate_keys_header( "static_assert(sizeof(SORTED_LANGUAGE_INDICES) / sizeof(SORTED_LANGUAGE_INDICES[0]) == getLanguageCount()," ) lines.append(' "SORTED_LANGUAGE_INDICES size mismatch");') + lines.append("") + + # V1 language.bin migration table -- frozen enum order from commit 2f969a9. + # Maps the old uint8_t index stored on disk to the current Language enum. + # If a Language enum value listed here is ever removed, this will fail to + # compile, signalling that the migration table needs updating. + v1_codes = [ + "EN", "ES", "FR", "DE", "CS", "PT", "RU", "SV", "RO", "CA", "UK", + "BE", "IT", "PL", "FI", "DA", "NL", "TR", "KK", "HU", "LT", "SI", + ] + lines.append("// V1 language.bin migration table (frozen enum order from 2f969a9)") + lines.append("constexpr Language V1_LANGUAGES[] = {") + lines.append(" " + ", ".join(f"Language::{c}" for c in v1_codes) + ",") + lines.append("};") + lines.append( + f"constexpr uint8_t V1_LANGUAGE_COUNT = {len(v1_codes)};" + ) _write_file(output_path, lines, verbose) @@ -645,13 +641,11 @@ def generate_strings_header( ] for code in languages: - lines.extend( - ( - f"extern const char STRINGS_{code}_DATA[];", - f"extern const uint16_t OFFSETS_{code}[];", - ) - ) - lines.extend(("", "} // namespace i18n_strings")) + lines.append(f"extern const char STRINGS_{code}_DATA[];") + lines.append(f"extern const uint16_t OFFSETS_{code}[];") + + lines.append("") + lines.append("} // namespace i18n_strings") _write_file(output_path, lines, verbose) @@ -671,10 +665,11 @@ def generate_strings_cpp( "", "#include ", "", - "// Language codes", - "const char* const LANGUAGE_CODES[] = {", ] + # LANGUAGE_CODES array + lines.append("// Language codes") + lines.append("const char* const LANGUAGE_CODES[] = {") for code in languages: _append_string_entry(lines, code) lines.append("};") @@ -697,29 +692,56 @@ def generate_strings_cpp( lines.append("};") lines.append("") - # Per-language flat string blobs and offset tables + # Per-language flat string blobs and offset tables. + # Non-English languages skip strings identical to English; their offset + # tables use bit 15 (0x8000) to flag "use English blob at offset & 0x7FFF". lines.append("namespace i18n_strings {") lines.append("") + en_strings = [translations[key][0] for key in string_keys] + en_offsets: List[int] = [] + for lang_idx, code in enumerate(languages): lang_strings = [translations[key][lang_idx] for key in string_keys] + is_english = lang_idx == 0 - # Precompute byte offsets (UTF-8 encoded, +1 per string for null terminator) - offsets: List[int] = [] - current_offset = 0 - for s in lang_strings: - offsets.append(current_offset) - current_offset += len(s.encode("utf-8")) + 1 - if current_offset > 65535: - raise ValueError( - f"Language {code}: total string data ({current_offset} bytes) " - "exceeds uint16_t offset range (65535)" - ) + if is_english: + # Precompute byte offsets (UTF-8 encoded, +1 per string for null terminator) + offsets: List[int] = [] + current_offset = 0 + for s in lang_strings: + offsets.append(current_offset) + current_offset += len(s.encode("utf-8")) + 1 + if current_offset > 0x7FFF: + raise ValueError( + f"Language {code}: blob size ({current_offset} bytes) exceeds " + "15-bit offset limit (32767)" + ) + en_offsets = list(offsets) + blob_strings = lang_strings + else: + offsets = [] + current_offset = 0 + blob_strings = [] + for i, (s, en_s) in enumerate(zip(lang_strings, en_strings)): + if s == en_s: + offsets.append(en_offsets[i] | 0x8000) + else: + offsets.append(current_offset) + current_offset += len(s.encode("utf-8")) + 1 + blob_strings.append(s) + if current_offset > 0x7FFF: + raise ValueError( + f"Language {code}: blob size ({current_offset} bytes) exceeds " + "15-bit offset limit (32767)" + ) # Flat string data blob — all strings concatenated with \0 separators. lines.append(f"const char STRINGS_{code}_DATA[] =") - for text in lang_strings: + for text in blob_strings: _append_string_data_entry(lines, text) + if not blob_strings: + _append_string_data_entry(lines, "") lines.append(";") lines.append("") @@ -738,13 +760,13 @@ def generate_strings_cpp( # Compile-time size checks lines.append("// Compile-time validation of array sizes") for code in languages: - lines.extend( - ( - f"static_assert(sizeof(i18n_strings::OFFSETS_{code}) / sizeof(i18n_strings::OFFSETS_{code}[0]) ==", - " static_cast(StrId::_COUNT),", - f' "OFFSETS_{code} size mismatch");', - ) + lines.append( + f"static_assert(sizeof(i18n_strings::OFFSETS_{code}) " + f"/ sizeof(i18n_strings::OFFSETS_{code}[0]) ==" ) + lines.append(" static_cast(StrId::_COUNT),") + lines.append(f' "OFFSETS_{code} size mismatch");') + _write_file(output_path, lines, verbose) @@ -760,43 +782,20 @@ def _print_language_table( string_keys: List[str], unused_keys: Set[str], data_sizes: List[int], - translations: Dict[str, List[str]], ) -> None: """Print a per-language summary table.""" total = len(string_keys) - headers = ( - "Language", - "Code", - "Own", - "Fallback", - "Unused", - "Data (B)", - "Unique (B)", - ) + headers = ("Language", "Code", "Own", "Fallback", "Unused", "Data (B)") rows = [] - for lang_idx, (code, name, inherited, size) in enumerate( - zip(language_codes, language_names, inherited_sets, data_sizes) + for code, name, inherited, size in zip( + language_codes, language_names, inherited_sets, data_sizes ): own = total - len(inherited) fallback = len(inherited) # strings this language translated but the code never calls unused = len(unused_keys - inherited) - unique_size = sum( - len(s.encode("utf-8")) + 1 - for s in {translations[k][lang_idx] for k in string_keys} - ) - rows.append( - ( - name, - code, - str(own), - str(fallback), - str(unused), - str(size), - str(unique_size), - ) - ) + rows.append((name, code, str(own), str(fallback), str(unused), str(size))) # EN first, then alphabetically by ISO code rows.sort(key=lambda r: (0 if r[1] == "EN" else 1, r[1])) @@ -821,34 +820,18 @@ def _print_language_table( for row in rows: _safe_print(fmt.format(*row)) used = total - len(unused_keys) - total_size = sum(data_sizes) + dedup_size = sum(data_sizes) n_lang = len(rows) n_keys = len(string_keys) - # Current layout: uint16_t offset table (2 B per string per language) offset_table_size = n_lang * n_keys * 2 - current_total = total_size + offset_table_size - - # Estimate the original pointer-based layout using deduplicated string storage. - unique_strings: Set[str] = set() - for values in translations.values(): - unique_strings.update(values) - unique_string_size = sum(len(s.encode("utf-8")) + 1 for s in unique_strings) - old_pointer_table_size = n_lang * n_keys * 4 - old_total = unique_string_size + old_pointer_table_size - saved = old_total - current_total - + current_total = dedup_size + offset_table_size print( f"\n Total: {total} | Used in code: {used} | Never used: {len(unused_keys)}" ) print( - f" Flash (now): {total_size:>7,} B strings + {offset_table_size:>6,} B offset tables (uint16_t)" + f" Flash: {dedup_size:>7,} B strings (deduped) + {offset_table_size:>6,} B offset tables" f" = {current_total:>7,} B" ) - print( - f" Flash (pointer model, deduped): {unique_string_size:>7,} B unique strings + {old_pointer_table_size:>6,} B pointer tables (ptr32)" - f" = {old_total:>7,} B" - ) - print(f" Estimated savings vs pointer model: {saved:,} B") def _append_string_data_entry(lines: List[str], text: str) -> None: @@ -951,12 +934,22 @@ def main( print() sys.exit(1) - # Compute per-language data blob sizes: - # sum of UTF-8 byte length + 1 (null terminator) per string - data_sizes = [ - sum(len(translations[k][i].encode("utf-8")) + 1 for k in string_keys) - for i in range(len(languages)) - ] + # Compute per-language data blob sizes (after dedup). + # Non-English languages omit strings identical to English. + data_sizes = [] + for i in range(len(languages)): + if i == 0: + data_sizes.append( + sum(len(translations[k][0].encode("utf-8")) + 1 for k in string_keys) + ) + else: + data_sizes.append( + sum( + len(translations[k][i].encode("utf-8")) + 1 + for k in string_keys + if translations[k][i] != translations[k][0] + ) + ) _print_language_table( languages, @@ -965,7 +958,6 @@ def main( string_keys, unused_set, data_sizes, - translations, ) print() @@ -1062,4 +1054,4 @@ else: Import("env") main(strip_unused=True) except NameError: - pass + pass \ No newline at end of file