Language updates
This commit is contained in:
+4
-6
@@ -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) {
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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: "Переключить бионическое чтение"
|
||||
|
||||
@@ -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"
|
||||
|
||||
+120
-128
@@ -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 <cstddef>",
|
||||
"",
|
||||
"// 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<size_t>(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<size_t>(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
|
||||
Reference in New Issue
Block a user