## Summary This PR introduces **Focus Reading**, a generic implementation of artificial fixation points (similar to Bionic Reading) designed to improve reading speed and focus by bolding the initial characters of words. This is achieved by dynamically bolding characters during indexing. <img width="500" alt="Focus Reading on X3" src="https://github.com/user-attachments/assets/94a632a5-82da-47be-957c-538b35bf84d9" /> ### Implementation Details #### Core Text Engine (`ParsedText`) - Modified `ParsedText::addWord` to implement a custom bolding algorithm. It uses a 45% ratio for bolding, with a minimum of 1 character and a maximum of 9. - UTF-8 Safety: Integrated `utf8NextCodepoint` to ensure character counting and string slicing occur at safe byte boundaries, preventing corruption of multi-byte characters (e.g., accented letters or smart quotes). - Intelligent Tokenization: This correctly identifies and separates "word" characters (letters, apostrophes, hyphens) from "non-word" characters (numbers, brackets, smart quotes). - Formatting Preservation: The logic ensures that punctuation is not "stolen" for the bolding count and that existing styles (like italics or underlines) are preserved across the bold/regular split. - Processing at indexing stage reduces CPU load at render-time and ensures layout/fit is unaffected. - Split details are tracked with `wordIsFocusSuffix`. After splitting and layout, suffixes are merged back into their preceding word entries to prevent a doubling of RAM usage. #### Settings and UI - Version Management: Bumped `SECTION_FILE_VERSION` to `21` - Global Settings: Added `focusReadingEnabled` to `CrossPointSettings`. - User Interface: Added a new toggle in the "Reader" section of the settings menu, positioned after the "Embedded Style" option. - Localization: Added the `STR_FOCUS_READING` string #### Plumbing - Plumbed the `focusReadingEnabled` boolean through `EpubReaderActivity`, `Section`, and `ChapterHtmlSlimParser` to ensure the user's setting reaches the `ParsedText` constructor during chapter indexing. ## Additional Context ### Files Changed - `lib/Epub/Epub/ParsedText.h / .cpp`: Core fixation logic and UTF-8 tokenization. - `lib/Epub/Epub/Section.h / .cpp`: Cache header updates and invalidation logic. - `lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h / .cpp`: Plumbing the setting to text blocks. - `src/CrossPointSettings.h`: Data persistence for the new setting. - `src/SettingsList.h`: UI toggle implementation. - `src/activities/reader/EpubReaderActivity.cpp`: Handling settings changes during reading sessions. - `lib/I18n/translations/*.yaml`: UI strings. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_
362 lines
13 KiB
YAML
362 lines
13 KiB
YAML
_language_name: "English"
|
|
_language_code: "EN"
|
|
_order: "0"
|
|
|
|
STR_CROSSPOINT: "CrossPoint"
|
|
STR_BOOTING: "BOOTING"
|
|
STR_SLEEPING: "SLEEPING"
|
|
STR_ENTERING_SLEEP: "Going to sleep"
|
|
STR_BROWSE_FILES: "Browse Files"
|
|
STR_FILE_TRANSFER: "File Transfer"
|
|
STR_SETTINGS_TITLE: "Settings"
|
|
STR_CONTINUE_READING: "Continue Reading"
|
|
STR_NO_OPEN_BOOK: "No open book"
|
|
STR_START_READING: "Start reading below"
|
|
STR_NO_FILES_FOUND: "No files found"
|
|
STR_SELECT_CHAPTER: "Select Chapter"
|
|
STR_NO_CHAPTERS: "No chapters"
|
|
STR_END_OF_BOOK: "End of book"
|
|
STR_EMPTY_CHAPTER: "Empty chapter"
|
|
STR_INDEXING: "Indexing"
|
|
STR_MEMORY_ERROR: "Memory error"
|
|
STR_PAGE_LOAD_ERROR: "Page load error"
|
|
STR_EMPTY_FILE: "Empty file"
|
|
STR_OUT_OF_BOUNDS: "Out of bounds"
|
|
STR_LOADING: "Loading..."
|
|
STR_LOADING_POPUP: "Loading"
|
|
STR_WIFI_NETWORKS: "WiFi Networks"
|
|
STR_NO_NETWORKS: "No networks found"
|
|
STR_NETWORKS_FOUND: "%zu networks found"
|
|
STR_SCANNING: "Scanning..."
|
|
STR_CONNECTING: "Connecting..."
|
|
STR_CONNECTED: "Connected!"
|
|
STR_CONNECTION_FAILED: "Connection Failed"
|
|
STR_FORGET_NETWORK: "Forget Network?"
|
|
STR_SAVE_PASSWORD: "Save password for next time?"
|
|
STR_PRESS_OK_SCAN: "Press OK to scan again"
|
|
STR_JOIN_NETWORK: "Join a Network"
|
|
STR_CREATE_HOTSPOT: "Create Hotspot"
|
|
STR_JOIN_DESC: "Connect to an existing WiFi network"
|
|
STR_HOTSPOT_DESC: "Create a WiFi network others can join"
|
|
STR_STARTING_HOTSPOT: "Starting Hotspot..."
|
|
STR_HOTSPOT_MODE: "Hotspot Mode"
|
|
STR_CONNECT_WIFI_HINT: "Connect your device to this WiFi network"
|
|
STR_OPEN_URL_HINT: "Open this URL in your browser"
|
|
STR_OR_HTTP_PREFIX: "or http://"
|
|
STR_SCAN_QR_HINT: "or scan QR code with your phone:"
|
|
STR_CALIBRE_WIRELESS: "Calibre Wireless"
|
|
STR_CALIBRE_WEB_URL: "OPDS URL"
|
|
STR_NETWORK_LEGEND: "* = Encrypted | + = Saved"
|
|
STR_MAC_ADDRESS: "MAC address:"
|
|
STR_CHECKING_WIFI: "Checking WiFi..."
|
|
STR_ENTER_WIFI_PASSWORD: "Enter WiFi Password"
|
|
STR_TO_PREFIX: "to "
|
|
STR_CALIBRE_RECEIVING: "Receiving: "
|
|
STR_CALIBRE_RECEIVED: "Received: "
|
|
STR_CALIBRE_INSTRUCTION_1: "1) Install CrossPoint Reader plugin"
|
|
STR_CALIBRE_INSTRUCTION_2: "2) Be on the same WiFi network"
|
|
STR_CALIBRE_INSTRUCTION_3: "3) In Calibre: \"Send to device\""
|
|
STR_CALIBRE_INSTRUCTION_4: "\"Keep this screen open while sending\""
|
|
STR_CAT_DISPLAY: "Display"
|
|
STR_CAT_READER: "Reader"
|
|
STR_CAT_CONTROLS: "Controls"
|
|
STR_CAT_SYSTEM: "System"
|
|
STR_SLEEP_SCREEN: "Sleep Screen"
|
|
STR_SLEEP_COVER_MODE: "Sleep Screen Cover Mode"
|
|
STR_HIDE_BATTERY: "Hide Battery %"
|
|
STR_EXTRA_SPACING: "Extra Paragraph Spacing"
|
|
STR_TEXT_AA: "Text Anti-Aliasing"
|
|
STR_IMAGES: "Images"
|
|
STR_IMAGES_DISPLAY: "Display"
|
|
STR_IMAGES_PLACEHOLDER: "Placeholder"
|
|
STR_IMAGES_SUPPRESS: "Suppress"
|
|
STR_SHORT_PWR_BTN: "Short Power Button Click"
|
|
STR_ORIENTATION: "Reading Orientation"
|
|
STR_SIDE_BTN_LAYOUT: "Side Button Layout (reader)"
|
|
STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior"
|
|
STR_LONG_PRESS_BEHAVIOR_OFF: "OFF"
|
|
STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip"
|
|
STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Orientation change"
|
|
STR_FONT_FAMILY: "Reader Font Family"
|
|
STR_FONT_SIZE: "Reader Font Size"
|
|
STR_LINE_SPACING: "Reader Line Spacing"
|
|
STR_SCREEN_MARGIN: "Reader Screen Margin"
|
|
STR_PARA_ALIGNMENT: "Reader Paragraph Alignment"
|
|
STR_HYPHENATION: "Hyphenation"
|
|
STR_TIME_TO_SLEEP: "Time to Sleep"
|
|
STR_SHOW_HIDDEN_FILES: "Show Hidden Files"
|
|
STR_REFRESH_FREQ: "Refresh Frequency"
|
|
STR_KOREADER_SYNC: "KOReader Sync"
|
|
STR_CHECK_UPDATES: "Check for updates"
|
|
STR_LANGUAGE: "Language"
|
|
STR_CLEAR_READING_CACHE: "Clear Reading Cache"
|
|
STR_USERNAME: "Username"
|
|
STR_PASSWORD: "Password"
|
|
STR_SYNC_SERVER_URL: "Sync Server URL"
|
|
STR_DOCUMENT_MATCHING: "Document Matching"
|
|
STR_AUTHENTICATE: "Authenticate"
|
|
STR_KOREADER_USERNAME: "KOReader Username"
|
|
STR_KOREADER_PASSWORD: "KOReader Password"
|
|
STR_FILENAME: "Filename"
|
|
STR_BINARY: "Binary"
|
|
STR_SET_CREDENTIALS_FIRST: "Set credentials first"
|
|
STR_WIFI_CONN_FAILED: "WiFi connection failed"
|
|
STR_AUTHENTICATING: "Authenticating..."
|
|
STR_AUTH_SUCCESS: "Successfully authenticated!"
|
|
STR_KOREADER_AUTH: "KOReader Auth"
|
|
STR_SYNC_READY: "KOReader sync is ready to use"
|
|
STR_AUTH_FAILED: "Authentication Failed"
|
|
STR_DONE: "Done"
|
|
STR_CLEAR_CACHE_WARNING_1: "This will clear all cached book data."
|
|
STR_CLEAR_CACHE_WARNING_2: "All reading progress will be lost!"
|
|
STR_CLEAR_CACHE_WARNING_3: "Books will need to be re-indexed"
|
|
STR_CLEAR_CACHE_WARNING_4: "when opened again."
|
|
STR_CLEARING_CACHE: "Clearing cache..."
|
|
STR_CACHE_CLEARED: "Cache Cleared"
|
|
STR_ITEMS_REMOVED: "items removed"
|
|
STR_FAILED_LOWER: "failed"
|
|
STR_CLEAR_CACHE_FAILED: "Failed to clear cache"
|
|
STR_CHECK_SERIAL_OUTPUT: "Check serial output for details"
|
|
STR_DARK: "Dark"
|
|
STR_LIGHT: "Light"
|
|
STR_CUSTOM: "Custom"
|
|
STR_COVER: "Cover"
|
|
STR_NONE_OPT: "None"
|
|
STR_FIT: "Fit"
|
|
STR_CROP: "Crop"
|
|
STR_NEVER: "Never"
|
|
STR_IN_READER: "In Reader"
|
|
STR_ALWAYS: "Always"
|
|
STR_IGNORE: "Ignore"
|
|
STR_SLEEP: "Sleep"
|
|
STR_PAGE_TURN: "Page Turn"
|
|
STR_FORCE_REFRESH: "Refresh Screen"
|
|
STR_PORTRAIT: "Portrait"
|
|
STR_LANDSCAPE_CW: "Landscape CW"
|
|
STR_INVERTED: "Inverted"
|
|
STR_LANDSCAPE_CCW: "Landscape CCW"
|
|
STR_PREV_NEXT: "Prev/Next"
|
|
STR_NEXT_PREV: "Next/Prev"
|
|
STR_NOTO_SERIF: "Noto Serif"
|
|
STR_NOTO_SANS: "Noto Sans"
|
|
STR_OPEN_DYSLEXIC: "Open Dyslexic"
|
|
STR_SMALL: "Small"
|
|
STR_MEDIUM: "Medium"
|
|
STR_LARGE: "Large"
|
|
STR_X_LARGE: "X Large"
|
|
STR_TIGHT: "Tight"
|
|
STR_NORMAL: "Normal"
|
|
STR_WIDE: "Wide"
|
|
STR_JUSTIFY: "Justify"
|
|
STR_ALIGN_LEFT: "Left"
|
|
STR_CENTER: "Center"
|
|
STR_ALIGN_RIGHT: "Right"
|
|
STR_MIN_1: "1 min"
|
|
STR_MIN_5: "5 min"
|
|
STR_MIN_10: "10 min"
|
|
STR_MIN_15: "15 min"
|
|
STR_MIN_30: "30 min"
|
|
STR_PAGES_1: "1 page"
|
|
STR_PAGES_5: "5 pages"
|
|
STR_PAGES_10: "10 pages"
|
|
STR_PAGES_15: "15 pages"
|
|
STR_PAGES_30: "30 pages"
|
|
STR_UPDATE: "Update"
|
|
STR_CHECKING_UPDATE: "Checking for update..."
|
|
STR_NEW_UPDATE: "New update available!"
|
|
STR_CURRENT_VERSION: "Current Version: "
|
|
STR_NEW_VERSION: "New Version: "
|
|
STR_UPDATING: "Updating..."
|
|
STR_NO_UPDATE: "No update available"
|
|
STR_UPDATE_FAILED: "Update failed"
|
|
STR_UPDATE_COMPLETE: "Update complete"
|
|
STR_POWER_ON_HINT: "Press and hold power button to turn back on"
|
|
STR_RESTARTING_HINT: "Restarting... If device does not restart, hold the power button for a few seconds."
|
|
STR_NO_ENTRIES: "No entries found"
|
|
STR_DOWNLOADING: "Downloading..."
|
|
STR_DOWNLOAD_FAILED: "Download failed"
|
|
STR_ERROR_MSG: "Error:"
|
|
STR_UNNAMED: "Unnamed"
|
|
STR_NO_SERVER_URL: "No server URL configured"
|
|
STR_FETCH_FEED_FAILED: "Failed to fetch feed"
|
|
STR_PARSE_FEED_FAILED: "Failed to parse feed"
|
|
STR_NEXT_PAGE: "Next Page »"
|
|
STR_PREV_PAGE: "« Previous Page"
|
|
STR_NETWORK_PREFIX: "Network: "
|
|
STR_IP_ADDRESS_PREFIX: "IP Address: "
|
|
STR_ERROR_GENERAL_FAILURE: "Error: General failure"
|
|
STR_ERROR_NETWORK_NOT_FOUND: "Error: Network not found"
|
|
STR_ERROR_CONNECTION_TIMEOUT: "Error: Connection timeout"
|
|
STR_SD_CARD: "SD card"
|
|
STR_BACK: "« Back"
|
|
STR_EXIT: "« Exit"
|
|
STR_HOME: "« Home"
|
|
STR_SELECT: "Select"
|
|
STR_SELECTED: "Selected"
|
|
STR_TOGGLE: "Toggle"
|
|
STR_CONFIRM: "Confirm"
|
|
STR_CANCEL: "Cancel"
|
|
STR_CONNECT: "Connect"
|
|
STR_OPEN: "Open"
|
|
STR_DOWNLOAD: "Download"
|
|
STR_RETRY: "Retry"
|
|
STR_YES: "Yes"
|
|
STR_NO: "No"
|
|
STR_SHOW: "Show"
|
|
STR_HIDE: "Hide"
|
|
STR_STATE_ON: "ON"
|
|
STR_STATE_OFF: "OFF"
|
|
STR_NOT_SET: "Not Set"
|
|
STR_DIR_LEFT: "Left"
|
|
STR_DIR_RIGHT: "Right"
|
|
STR_DIR_UP: "Up"
|
|
STR_DIR_DOWN: "Down"
|
|
STR_OK_BUTTON: "OK"
|
|
STR_SLEEP_COVER_FILTER: "Sleep Screen Cover Filter"
|
|
STR_FILTER_CONTRAST: "Contrast"
|
|
STR_CUSTOMISE_STATUS_BAR: "Customise Status Bar"
|
|
STR_CHAPTER_PAGE_COUNT: "Chapter Page Count"
|
|
STR_BOOK_PROGRESS_PERCENTAGE: "Book Progress Percentage"
|
|
STR_PROGRESS_BAR: "Progress Bar"
|
|
STR_PROGRESS_BAR_THICKNESS: "Progress Bar Thickness"
|
|
STR_PROGRESS_BAR_THIN: "Thin"
|
|
STR_PROGRESS_BAR_MEDIUM: "Medium"
|
|
STR_PROGRESS_BAR_THICK: "Thick"
|
|
STR_BOOK: "Book"
|
|
STR_CHAPTER: "Chapter"
|
|
STR_EXAMPLE_CHAPTER: "Chapter 21"
|
|
STR_EXAMPLE_BOOK: "Book Title"
|
|
STR_PREVIEW: "Preview"
|
|
STR_TITLE: "Title"
|
|
STR_BATTERY: "Battery"
|
|
STR_XTC_STATUS_BAR: "XTC Status Bar"
|
|
STR_BOTTOM: "Bottom"
|
|
STR_TOP: "Top"
|
|
STR_UI_THEME: "UI Theme"
|
|
STR_THEME_CLASSIC: "Classic"
|
|
STR_THEME_LYRA: "Lyra"
|
|
STR_THEME_ROUNDEDRAFF: "RoundedRaff"
|
|
STR_THEME_LYRA_EXTENDED: "Lyra Extended"
|
|
STR_SUNLIGHT_FADING_FIX: "Sunlight Fading Fix"
|
|
STR_REMAP_FRONT_BUTTONS: "Remap Front Buttons"
|
|
STR_OPDS_BROWSER: "OPDS Browser"
|
|
STR_SEARCH: "Search"
|
|
STR_COVER_CUSTOM: "Cover + Custom"
|
|
STR_MENU_RECENT_BOOKS: "Recent Books"
|
|
STR_NO_RECENT_BOOKS: "No recent books"
|
|
STR_CALIBRE_DESC: "Use Calibre wireless device transfers"
|
|
STR_FORGET_AND_REMOVE: "Forget network and remove saved password?"
|
|
STR_FORGET_BUTTON: "Forget"
|
|
STR_CALIBRE_STARTING: "Starting Calibre..."
|
|
STR_CALIBRE_SETUP: "Setup"
|
|
STR_CALIBRE_STATUS: "Status"
|
|
STR_CLEAR_BUTTON: "Clear"
|
|
STR_DEFAULT_VALUE: "Default"
|
|
STR_REMAP_PROMPT: "Press a front button for each role"
|
|
STR_UNASSIGNED: "Unassigned"
|
|
STR_ALREADY_ASSIGNED: "Already assigned"
|
|
STR_REMAP_RESET_HINT: "Side button Up: Reset to default layout"
|
|
STR_REMAP_CANCEL_HINT: "Side button Down: Cancel remapping"
|
|
STR_HW_BACK_LABEL: "Back (1st button)"
|
|
STR_HW_CONFIRM_LABEL: "Confirm (2nd button)"
|
|
STR_HW_LEFT_LABEL: "Left (3rd button)"
|
|
STR_HW_RIGHT_LABEL: "Right (4th button)"
|
|
STR_GO_TO_PERCENT: "Go to %"
|
|
STR_GO_HOME_BUTTON: "Go Home"
|
|
STR_SYNC_PROGRESS: "Sync Progress"
|
|
STR_DELETE_CACHE: "Delete Book Cache"
|
|
STR_DELETE: "Delete"
|
|
STR_DISPLAY_QR: "Show page as QR"
|
|
STR_CHAPTER_PREFIX: "Chapter: "
|
|
STR_PAGES_SEPARATOR: " pages | "
|
|
STR_BOOK_PREFIX: "Book: "
|
|
STR_CALIBRE_URL_HINT: "For Calibre, add /opds to your URL"
|
|
STR_PERCENT_STEP_HINT: "Left/Right: 1% Up/Down: 10%"
|
|
STR_SYNCING_TIME: "Syncing time..."
|
|
STR_CALC_HASH: "Calculating document hash..."
|
|
STR_HASH_FAILED: "Failed to calculate document hash"
|
|
STR_FETCH_PROGRESS: "Fetching remote progress..."
|
|
STR_UPLOAD_PROGRESS: "Uploading progress..."
|
|
STR_NO_CREDENTIALS_MSG: "No credentials configured"
|
|
STR_KOREADER_SETUP_HINT: "Set up KOReader account in Settings"
|
|
STR_PROGRESS_FOUND: "Progress found!"
|
|
STR_REMOTE_LABEL: "Remote:"
|
|
STR_LOCAL_LABEL: "Local:"
|
|
STR_PAGE_OVERALL_FORMAT: "Page %d, %.2f%% overall"
|
|
STR_PAGE_TOTAL_OVERALL_FORMAT: "Page %d/%d, %.2f%% overall"
|
|
STR_DEVICE_FROM_FORMAT: " From: %s"
|
|
STR_APPLY_REMOTE: "Apply remote progress"
|
|
STR_UPLOAD_LOCAL: "Upload local progress"
|
|
STR_NO_REMOTE_MSG: "No remote progress found"
|
|
STR_UPLOAD_PROMPT: "Upload current position?"
|
|
STR_UPLOAD_SUCCESS: "Progress uploaded!"
|
|
STR_SYNC_FAILED_MSG: "Sync failed"
|
|
STR_SAVE_PROGRESS_FAILED: "Could not save progress"
|
|
STR_SECTION_PREFIX: "Section "
|
|
STR_UPLOAD: "Upload"
|
|
STR_BOOK_S_STYLE: "Book's Style"
|
|
STR_EMBEDDED_STYLE: "Embedded Style"
|
|
STR_FOCUS_READING: "Focus Reading"
|
|
STR_OPDS_SERVER_URL: "OPDS Server URL"
|
|
STR_SET_SLEEP_COVER: "Set Cover"
|
|
STR_FOOTNOTES: "Footnotes"
|
|
STR_NO_FOOTNOTES: "No footnotes on this page"
|
|
STR_LINK: "[link]"
|
|
STR_SCREENSHOT_BUTTON: "Take screenshot"
|
|
STR_ADD_SERVER: "Add Server"
|
|
STR_SERVER_NAME: "Server Name"
|
|
STR_NO_SERVERS: "No OPDS servers configured"
|
|
STR_DELETE_SERVER: "Delete Server"
|
|
STR_DELETE_CONFIRM: "Delete this server?"
|
|
STR_OPDS_SERVERS: "OPDS Servers"
|
|
STR_AUTO_TURN_ENABLED: "Auto Turn Enabled: "
|
|
STR_AUTO_TURN_PAGES_PER_MIN: "Auto Turn (Pages Per Minute)"
|
|
STR_DOWNLOAD_FONTS: "Download Fonts"
|
|
STR_FONT_DOWNLOAD: "Font Download"
|
|
STR_LOADING_FONT_LIST: "Loading font list..."
|
|
STR_NO_FONTS_AVAILABLE: "No fonts available"
|
|
STR_FONT_INSTALLED: "Font installed!"
|
|
STR_FONT_INSTALL_FAILED: "Font installation failed"
|
|
STR_INSTALLED: "Installed"
|
|
STR_CONFIRM_DOWNLOAD_PROMPT: "Download?"
|
|
STR_SD_CARD_FULL: "Insufficient SD card space"
|
|
STR_FILES_LABEL: "Files: "
|
|
STR_SIZE_LABEL: "Size: "
|
|
STR_REDOWNLOAD: "Re-download"
|
|
STR_DOWNLOAD_ALL: "Download / Update All"
|
|
STR_ALL_FONTS_INSTALLED: "All fonts installed!"
|
|
STR_UPDATE_AVAILABLE: "Update"
|
|
STR_CRASH_TITLE: "System Crash"
|
|
STR_CRASH_DESCRIPTION: "A detailed report was saved to crash_report.txt. Please include this file in your bug report."
|
|
STR_CRASH_REASON: "Crash reason:"
|
|
STR_CRASH_NO_REASON: "(No reason was recorded)"
|
|
STR_TILT_PAGE_TURN: "Tilt Page Turn"
|
|
STR_KB_HINT_MOVE_CURSOR: "Press LEFT or RIGHT to move cursor"
|
|
STR_KB_HINT_RETURN_CURSOR: "Press LEFT to return to cursor position"
|
|
STR_KB_HINT_HIDE_PASSWORD: "Hold RIGHT then press [***] to hide password"
|
|
STR_KB_HINT_SHOW_PASSWORD: "Hold RIGHT then press [abc] to show password"
|
|
STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Press [***] to hide password"
|
|
STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Press [abc] to show password"
|
|
STR_KB_HINT_EDIT_ENTRY: "Hold UP to edit entry"
|
|
STR_KB_TIPS: "Tips:"
|
|
STR_KB_HINT_RETURN_KEYBOARD: "Press DOWN to return to keyboard"
|
|
STR_KB_HINT_EXIT_URL_MODE: "Press ABC to exit URL mode"
|
|
STR_KB_HINT_CLEAR_TEXT: "Hold DEL to clear all text"
|
|
STR_KB_HINT_SECONDARY_CHAR: "Hold SELECT for secondary char"
|
|
STR_KB_HINT_UPPER_SECONDARY: "Hold SELECT for UPPERCASE or secondary char"
|
|
STR_KB_HINT_LOWER_SECONDARY: "Hold SELECT for lowercase or secondary char"
|
|
STR_KB_HINT_URL_SNIPPETS: "Press URL for snippets"
|
|
STR_SD_FIRMWARE_UPDATE: "SD Card Firmware Update"
|
|
STR_SELECT_FIRMWARE_FILE: "Select firmware file (.bin)"
|
|
STR_NO_BIN_FILES: "No .bin files found"
|
|
STR_VALIDATING_FIRMWARE: "Validating firmware..."
|
|
STR_INVALID_FIRMWARE: "Invalid firmware file"
|
|
STR_FIRMWARE_TOO_LARGE: "Firmware too large for partition"
|
|
STR_FIRMWARE_TOO_SMALL: "Firmware file is too small"
|
|
STR_FIRMWARE_UPDATE_PROMPT: "Update firmware?"
|
|
STR_FIRMWARE_FILE_OPEN_FAILED: "Cannot open file"
|
|
STR_FIRMWARE_WRITE_FAILED: "Firmware write failed"
|
|
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Do not power off!"
|
|
STR_RECOVERY_MODE: "Recovery Mode"
|
|
STR_RECOVERY_MODE_HINT: "Place firmware.bin on SD card root and select it"
|