feat: User-Interface I18n System (#728)
**What is the goal of this PR?** This PR introduces Internationalization (i18n) support, enabling users to switch the UI language dynamically. **What changes are included?** - Core Logic: Added I18n class (`lib/I18n/I18n.h/cpp`) to manage language state and string retrieval. - Data Structures: - `lib/I18n/I18nStrings.h/cpp`: Static string arrays for each supported language. - `lib/I18n/I18nKeys.h`: Enum definitions for type-safe string access. - `lib/I18n/translations.csv`: single source of truth. - Documentation: Added `docs/i18n.md` detailing the workflow for developers and translators. - New Settings activity: `src/activities/settings/LanguageSelectActivity.h/cpp` This implementation (building on concepts from #505) prioritizes performance and memory efficiency. The core approach is to store all localized strings for each language in dedicated arrays and access them via enums. This provides O(1) access with zero runtime overhead, and avoids the heap allocations, hashing, and collision handling required by `std::map` or `std::unordered_map`. The main trade-off is that enums and string arrays must remain perfectly synchronized—any mismatch would result in incorrect strings being displayed in the UI. To eliminate this risk, I added a Python script that automatically generates `I18nStrings.h/.cpp` and `I18nKeys.h` from a CSV file, which will serve as the single source of truth for all translations. The full design and workflow are documented in `docs/i18n.md`. - [x] Python script `generate_i18n.py` to auto-generate C++ files from CSV - [x] Populate translations.csv with initial translations. Currently available translations: English, Español, Français, Deutsch, Čeština, Português (Brasil), Русский, Svenska. Thanks, community! **Status:** EDIT: ready to be merged. As a proof of concept, the SPANISH strings currently mirror the English ones, but are fully uppercased. --- Did you use AI tools to help write this code? _**< PARTIALLY >**_ I used AI for the black work of replacing strings with I18n references across the project, and for generating the documentation. EDIT: also some help with merging changes from master. --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: yeyeto2788 <juanernestobiondi@gmail.com>
This commit is contained in:
317
lib/I18n/translations/spanish.yaml
Normal file
317
lib/I18n/translations/spanish.yaml
Normal file
@@ -0,0 +1,317 @@
|
||||
_language_name: "Español"
|
||||
_language_code: "SPANISH"
|
||||
_order: "1"
|
||||
|
||||
STR_CROSSPOINT: "CrossPoint"
|
||||
STR_BOOTING: "BOOTING"
|
||||
STR_SLEEPING: "SLEEPING"
|
||||
STR_ENTERING_SLEEP: "ENTERING SLEEP..."
|
||||
STR_BROWSE_FILES: "Buscar archivos"
|
||||
STR_FILE_TRANSFER: "Transferencia de archivos"
|
||||
STR_SETTINGS_TITLE: "Configuración"
|
||||
STR_CALIBRE_LIBRARY: "Libreria Calibre"
|
||||
STR_CONTINUE_READING: "Continuar leyendo"
|
||||
STR_NO_OPEN_BOOK: "No hay libros abiertos"
|
||||
STR_START_READING: "Start reading below"
|
||||
STR_BOOKS: "Libros"
|
||||
STR_NO_BOOKS_FOUND: "No se encontraron libros"
|
||||
STR_SELECT_CHAPTER: "Seleccionar capítulo"
|
||||
STR_NO_CHAPTERS: "Sin capítulos"
|
||||
STR_END_OF_BOOK: "Fin del libro"
|
||||
STR_EMPTY_CHAPTER: "Capítulo vacío"
|
||||
STR_INDEXING: "Indexando..."
|
||||
STR_MEMORY_ERROR: "Error de memoria"
|
||||
STR_PAGE_LOAD_ERROR: "Error al cargar la página"
|
||||
STR_EMPTY_FILE: "Archivo vacío"
|
||||
STR_OUT_OF_BOUNDS: "Out of bounds"
|
||||
STR_LOADING: "Cargando..."
|
||||
STR_LOAD_XTC_FAILED: "Error al cargar XTC"
|
||||
STR_LOAD_TXT_FAILED: "Error al cargar TXT"
|
||||
STR_LOAD_EPUB_FAILED: "Error al cargar EPUB"
|
||||
STR_SD_CARD_ERROR: "Error en la tarjeta SD"
|
||||
STR_WIFI_NETWORKS: "Redes Wi-Fi"
|
||||
STR_NO_NETWORKS: "No hay redes disponibles"
|
||||
STR_NETWORKS_FOUND: "%zu redes encontradas"
|
||||
STR_SCANNING: "Buscando..."
|
||||
STR_CONNECTING: "Conectando..."
|
||||
STR_CONNECTED: "Conectado!"
|
||||
STR_CONNECTION_FAILED: "Error de conexion"
|
||||
STR_CONNECTION_TIMEOUT: "Connection timeout"
|
||||
STR_FORGET_NETWORK: "Olvidar la red?"
|
||||
STR_SAVE_PASSWORD: "Guardar contraseña para la próxima vez?"
|
||||
STR_REMOVE_PASSWORD: "Borrar contraseñas guardadas?"
|
||||
STR_PRESS_OK_SCAN: "Presione OK para buscar de nuevo"
|
||||
STR_PRESS_ANY_CONTINUE: "Presione cualquier botón para continuar"
|
||||
STR_SELECT_HINT: "Izquierda/Derecha: Seleccionar | OK: Confirmar"
|
||||
STR_HOW_CONNECT: "Cómo te gustaría conectarte?"
|
||||
STR_JOIN_NETWORK: "Unirse a una red"
|
||||
STR_CREATE_HOTSPOT: "Crear punto de acceso"
|
||||
STR_JOIN_DESC: "Conectarse a una red Wi-Fi existente"
|
||||
STR_HOTSPOT_DESC: "Crear una red Wi-Fi para que otros se unan"
|
||||
STR_STARTING_HOTSPOT: "Iniciando punto de acceso..."
|
||||
STR_HOTSPOT_MODE: "Modo punto de acceso"
|
||||
STR_CONNECT_WIFI_HINT: "Conectar su dispositivo a esta red Wi-Fi"
|
||||
STR_OPEN_URL_HINT: "Abre esta dirección en tu navegador"
|
||||
STR_OR_HTTP_PREFIX: "o http://"
|
||||
STR_SCAN_QR_HINT: "o escanee este código QR con su móvil:"
|
||||
STR_CALIBRE_WIRELESS: "Calibre inalámbrico"
|
||||
STR_CALIBRE_WEB_URL: "URL del sitio web de Calibre"
|
||||
STR_CONNECT_WIRELESS: "Conectar como dispositivo inalámbrico"
|
||||
STR_NETWORK_LEGEND: "* = Cifrado | + = Guardado"
|
||||
STR_MAC_ADDRESS: "Dirección MAC:"
|
||||
STR_CHECKING_WIFI: "Verificando Wi-Fi..."
|
||||
STR_ENTER_WIFI_PASSWORD: "Introduzca la contraseña de Wi-Fi"
|
||||
STR_ENTER_TEXT: "Introduzca el texto"
|
||||
STR_TO_PREFIX: "a "
|
||||
STR_CALIBRE_DISCOVERING: "Discovering Calibre..."
|
||||
STR_CALIBRE_CONNECTING_TO: "Conectándose a"
|
||||
STR_CALIBRE_CONNECTED_TO: "Conectado a "
|
||||
STR_CALIBRE_WAITING_COMMANDS: "Esperando comandos..."
|
||||
STR_CONNECTION_FAILED_RETRYING: "(Error de conexión, intentándolo nuevamente)"
|
||||
STR_CALIBRE_DISCONNECTED: "Calibre desconectado"
|
||||
STR_CALIBRE_WAITING_TRANSFER: "Esperando transferencia..."
|
||||
STR_CALIBRE_TRANSFER_HINT: "Si la transferencia falla, habilite \\n'Ignorar espacio libre' en las configuraciones del \\nplugin smartdevice de calibre."
|
||||
STR_CALIBRE_RECEIVING: "Recibiendo: "
|
||||
STR_CALIBRE_RECEIVED: "Recibido: "
|
||||
STR_CALIBRE_WAITING_MORE: "Esperando más..."
|
||||
STR_CALIBRE_FAILED_CREATE_FILE: "Error al crear el archivo"
|
||||
STR_CALIBRE_PASSWORD_REQUIRED: "Contraseña requerida"
|
||||
STR_CALIBRE_TRANSFER_INTERRUPTED: "Transferencia interrumpida"
|
||||
STR_CALIBRE_INSTRUCTION_1: "1) Instala CrossPoint Reader plugin"
|
||||
STR_CALIBRE_INSTRUCTION_2: "2) Conéctese a la misma red Wi-Fi"
|
||||
STR_CALIBRE_INSTRUCTION_3: "3) En Calibre: \"Enviar a dispotivo\""
|
||||
STR_CALIBRE_INSTRUCTION_4: "\"Permanezca en esta pantalla mientras se envía\""
|
||||
STR_CAT_DISPLAY: "Pantalla"
|
||||
STR_CAT_READER: "Lector"
|
||||
STR_CAT_CONTROLS: "Control"
|
||||
STR_CAT_SYSTEM: "Sistema"
|
||||
STR_SLEEP_SCREEN: "Salva Pantallas"
|
||||
STR_SLEEP_COVER_MODE: "Modo de salva pantallas"
|
||||
STR_STATUS_BAR: "Barra de estado"
|
||||
STR_HIDE_BATTERY: "Ocultar porcentaje de batería"
|
||||
STR_EXTRA_SPACING: "Espaciado extra de párrafos"
|
||||
STR_TEXT_AA: "Suavizado de bordes de texto"
|
||||
STR_SHORT_PWR_BTN: "Clic breve del botón de encendido"
|
||||
STR_ORIENTATION: "Orientación de la lectura"
|
||||
STR_FRONT_BTN_LAYOUT: "Diseño de los botones frontales"
|
||||
STR_SIDE_BTN_LAYOUT: "Diseño de los botones laterales (Lector)"
|
||||
STR_LONG_PRESS_SKIP: "Pasar a la capítulo al presiónar largamente"
|
||||
STR_FONT_FAMILY: "Familia de tipografía del lector"
|
||||
STR_EXT_READER_FONT: "Tipografía externa"
|
||||
STR_EXT_CHINESE_FONT: "Tipografía (Lectura)"
|
||||
STR_EXT_UI_FONT: "Tipografía (Pantalla)"
|
||||
STR_FONT_SIZE: "Tamaño de la fuente (Pantalla)"
|
||||
STR_LINE_SPACING: "Interlineado (Lectura)"
|
||||
STR_ASCII_LETTER_SPACING: "Espaciado de letras ASCII"
|
||||
STR_ASCII_DIGIT_SPACING: "Espaciado de dígitos ASCII"
|
||||
STR_CJK_SPACING: "Espaciado CJK"
|
||||
STR_COLOR_MODE: "Modo de color"
|
||||
STR_SCREEN_MARGIN: "Margen de lectura"
|
||||
STR_PARA_ALIGNMENT: "Ajuste de parágrafo del lector"
|
||||
STR_HYPHENATION: "Hyphenation"
|
||||
STR_TIME_TO_SLEEP: "Tiempo para dormir"
|
||||
STR_REFRESH_FREQ: "Frecuencia de actualización"
|
||||
STR_CALIBRE_SETTINGS: "Configuraciones de Calibre"
|
||||
STR_KOREADER_SYNC: "Síncronización de KOReader"
|
||||
STR_CHECK_UPDATES: "Verificar actualizaciones"
|
||||
STR_LANGUAGE: "Idioma"
|
||||
STR_SELECT_WALLPAPER: "Seleccionar fondo"
|
||||
STR_CLEAR_READING_CACHE: "Borrar caché de lectura"
|
||||
STR_CALIBRE: "Calibre"
|
||||
STR_USERNAME: "Nombre de usuario"
|
||||
STR_PASSWORD: "Contraseña"
|
||||
STR_SYNC_SERVER_URL: "URL del servidor de síncronización"
|
||||
STR_DOCUMENT_MATCHING: "Coincidencia de documentos"
|
||||
STR_AUTHENTICATE: "Autentificar"
|
||||
STR_KOREADER_USERNAME: "Nombre de usuario de KOReader"
|
||||
STR_KOREADER_PASSWORD: "Contraseña de KOReader"
|
||||
STR_FILENAME: "Nombre del archivo"
|
||||
STR_BINARY: "Binario"
|
||||
STR_SET_CREDENTIALS_FIRST: "Configurar credenciales primero"
|
||||
STR_WIFI_CONN_FAILED: "Falló la conexión Wi-Fi"
|
||||
STR_AUTHENTICATING: "Autentificando..."
|
||||
STR_AUTH_SUCCESS: "Autenticación exitsosa!"
|
||||
STR_KOREADER_AUTH: "Autenticación KOReader"
|
||||
STR_SYNC_READY: "La síncronización de KOReader está lista para usarse"
|
||||
STR_AUTH_FAILED: "Falló la autenticación"
|
||||
STR_DONE: "Hecho"
|
||||
STR_CLEAR_CACHE_WARNING_1: "Esto borrará todos los datos en cache del libro."
|
||||
STR_CLEAR_CACHE_WARNING_2: " ¡Se perderá todo el avance de leer!"
|
||||
STR_CLEAR_CACHE_WARNING_3: "Los libros deberán ser reíndexados"
|
||||
STR_CLEAR_CACHE_WARNING_4: "cuando se abran de nuevo."
|
||||
STR_CLEARING_CACHE: "Borrando caché..."
|
||||
STR_CACHE_CLEARED: "Cache limpia"
|
||||
STR_ITEMS_REMOVED: "Elementos eliminados"
|
||||
STR_FAILED_LOWER: "Falló"
|
||||
STR_CLEAR_CACHE_FAILED: "No se pudo borrar la cache"
|
||||
STR_CHECK_SERIAL_OUTPUT: "Verifique la salida serial para detalles"
|
||||
STR_DARK: "Oscuro"
|
||||
STR_LIGHT: "Claro"
|
||||
STR_CUSTOM: "Personalizado"
|
||||
STR_COVER: "Portada"
|
||||
STR_NONE_OPT: "Ninguno"
|
||||
STR_FIT: "Ajustar"
|
||||
STR_CROP: "Recortar"
|
||||
STR_NO_PROGRESS: "Sin avance"
|
||||
STR_FULL_OPT: "Completa"
|
||||
STR_NEVER: "Nunca"
|
||||
STR_IN_READER: "En el lector"
|
||||
STR_ALWAYS: "Siempre"
|
||||
STR_IGNORE: "Ignorar"
|
||||
STR_SLEEP: "Dormir"
|
||||
STR_PAGE_TURN: "Paso de página"
|
||||
STR_PORTRAIT: "Portrato"
|
||||
STR_LANDSCAPE_CW: "Paisaje sentido horario"
|
||||
STR_INVERTED: "Invertido"
|
||||
STR_LANDSCAPE_CCW: "Paisaje sentido antihorario"
|
||||
STR_FRONT_LAYOUT_BCLR: "Atrás, Confirmar, Izquierda, Derecha"
|
||||
STR_FRONT_LAYOUT_LRBC: "Izquierda, Derecha, Atrás, Confirmar"
|
||||
STR_FRONT_LAYOUT_LBCR: "Izquierda, Atrás, Confirmar, Derecha"
|
||||
STR_PREV_NEXT: "Anterior/Siguiente"
|
||||
STR_NEXT_PREV: "Siguiente/Anterior"
|
||||
STR_BOOKERLY: "Relacionado con libros"
|
||||
STR_NOTO_SANS: "Noto Sans"
|
||||
STR_OPEN_DYSLEXIC: "Open Dyslexic"
|
||||
STR_SMALL: "Pequeño"
|
||||
STR_MEDIUM: "Medio"
|
||||
STR_LARGE: "Grande"
|
||||
STR_X_LARGE: "Extra grande"
|
||||
STR_TIGHT: "Ajustado"
|
||||
STR_NORMAL: "Normal"
|
||||
STR_WIDE: "Ancho"
|
||||
STR_JUSTIFY: "Justificar"
|
||||
STR_ALIGN_LEFT: "Izquierda"
|
||||
STR_CENTER: "Centro"
|
||||
STR_ALIGN_RIGHT: "Derecha"
|
||||
STR_MIN_1: "1 Minuto"
|
||||
STR_MIN_5: "10 Minutos"
|
||||
STR_MIN_10: "5 Minutos"
|
||||
STR_MIN_15: "15 Minutos"
|
||||
STR_MIN_30: "30 Minutos"
|
||||
STR_PAGES_1: "1 Página"
|
||||
STR_PAGES_5: "5 Páginas"
|
||||
STR_PAGES_10: "10 Páginas"
|
||||
STR_PAGES_15: "15 Páginas"
|
||||
STR_PAGES_30: "30 Páginas"
|
||||
STR_UPDATE: "ActualizaR"
|
||||
STR_CHECKING_UPDATE: "Verificando actualización..."
|
||||
STR_NEW_UPDATE: "¡Nueva actualización disponible!"
|
||||
STR_CURRENT_VERSION: "Versión actual:"
|
||||
STR_NEW_VERSION: "Nueva versión:"
|
||||
STR_UPDATING: "Actualizando..."
|
||||
STR_NO_UPDATE: "No hay actualizaciones disponibles"
|
||||
STR_UPDATE_FAILED: "Falló la actualización"
|
||||
STR_UPDATE_COMPLETE: "Actualización completada"
|
||||
STR_POWER_ON_HINT: "Presione y mantenga presionado el botón de encendido para volver a encender"
|
||||
STR_EXTERNAL_FONT: "Fuente externa"
|
||||
STR_BUILTIN_DISABLED: "Incorporado (Desactivado)"
|
||||
STR_NO_ENTRIES: "No se encontraron elementos"
|
||||
STR_DOWNLOADING: "Descargando..."
|
||||
STR_DOWNLOAD_FAILED: "Falló la descarga"
|
||||
STR_ERROR_MSG: "Error"
|
||||
STR_UNNAMED: "Sin nombre"
|
||||
STR_NO_SERVER_URL: "No se ha configurado la url del servidor"
|
||||
STR_FETCH_FEED_FAILED: "Failed to fetch feed"
|
||||
STR_PARSE_FEED_FAILED: "Failed to parse feed"
|
||||
STR_NETWORK_PREFIX: "Red: "
|
||||
STR_IP_ADDRESS_PREFIX: "Dirección IP: "
|
||||
STR_SCAN_QR_WIFI_HINT: "O escanee el código QR con su teléfono para conectarse a WI-FI."
|
||||
STR_ERROR_GENERAL_FAILURE: "Error: Fallo general"
|
||||
STR_ERROR_NETWORK_NOT_FOUND: "Error: Red no encontrada"
|
||||
STR_ERROR_CONNECTION_TIMEOUT: "Error: Connection timeout"
|
||||
STR_SD_CARD: "Tarjeta SD"
|
||||
STR_BACK: "« Atrás"
|
||||
STR_EXIT: "« SaliR"
|
||||
STR_HOME: "« Inicio"
|
||||
STR_SAVE: "« Guardar"
|
||||
STR_SELECT: "Seleccionar"
|
||||
STR_TOGGLE: "Cambiar"
|
||||
STR_CONFIRM: "Confirmar"
|
||||
STR_CANCEL: "Cancelar"
|
||||
STR_CONNECT: "Conectar"
|
||||
STR_OPEN: "Abrir"
|
||||
STR_DOWNLOAD: "Descargar"
|
||||
STR_RETRY: "Reintentar"
|
||||
STR_YES: "Sí"
|
||||
STR_NO: "No"
|
||||
STR_STATE_ON: "ENCENDIDO"
|
||||
STR_STATE_OFF: "APAGADO"
|
||||
STR_SET: "Configurar"
|
||||
STR_NOT_SET: "No configurado"
|
||||
STR_DIR_LEFT: "Izquierda"
|
||||
STR_DIR_RIGHT: "Derecha"
|
||||
STR_DIR_UP: "Arriba"
|
||||
STR_DIR_DOWN: "Abajo"
|
||||
STR_CAPS_ON: "MAYÚSCULAS"
|
||||
STR_CAPS_OFF: "caps"
|
||||
STR_OK_BUTTON: "OK"
|
||||
STR_ON_MARKER: "[ENCENDIDO]"
|
||||
STR_SLEEP_COVER_FILTER: "Filtro de salva pantalla y protección de la pantalla"
|
||||
STR_FILTER_CONTRAST: "Contraste"
|
||||
STR_STATUS_BAR_FULL_PERCENT: "Completa con porcentaje"
|
||||
STR_STATUS_BAR_FULL_BOOK: "Completa con progreso del libro"
|
||||
STR_STATUS_BAR_BOOK_ONLY: "Solo progreso del libro"
|
||||
STR_STATUS_BAR_FULL_CHAPTER: "Completa con progreso de capítulos"
|
||||
STR_UI_THEME: "Estilo de pantalla"
|
||||
STR_THEME_CLASSIC: "Clásico"
|
||||
STR_THEME_LYRA: "LYRA"
|
||||
STR_SUNLIGHT_FADING_FIX: "Corrección de desvastado por sol"
|
||||
STR_REMAP_FRONT_BUTTONS: "Reconfigurar botones frontales"
|
||||
STR_OPDS_BROWSER: "Navegador opds"
|
||||
STR_COVER_CUSTOM: "Portada + Personalizado"
|
||||
STR_RECENTS: "Recientes"
|
||||
STR_MENU_RECENT_BOOKS: "Libros recientes"
|
||||
STR_NO_RECENT_BOOKS: "No hay libros recientes"
|
||||
STR_CALIBRE_DESC: "Utilice las transferencias dispositivos inalámbricos de calibre"
|
||||
STR_FORGET_AND_REMOVE: "Olvidar la red y eliminar la contraseña guardada?"
|
||||
STR_FORGET_BUTTON: "Olvidar la red"
|
||||
STR_CALIBRE_STARTING: "Iniciando calibre..."
|
||||
STR_CALIBRE_SETUP: "Configuración"
|
||||
STR_CALIBRE_STATUS: "Estado"
|
||||
STR_CLEAR_BUTTON: "Borrar"
|
||||
STR_DEFAULT_VALUE: "Previo"
|
||||
STR_REMAP_PROMPT: "Presione un botón frontal para cada función"
|
||||
STR_UNASSIGNED: "No asignado"
|
||||
STR_ALREADY_ASSIGNED: "Ya asignado"
|
||||
STR_REMAP_RESET_HINT: "Botón lateral arriba: Restablecer a la configuración previo"
|
||||
STR_REMAP_CANCEL_HINT: "Botón lateral abajo: Anular reconfiguración"
|
||||
STR_HW_BACK_LABEL: "Atrás (Primer botón)"
|
||||
STR_HW_CONFIRM_LABEL: "Confirmar (Segundo botón)"
|
||||
STR_HW_LEFT_LABEL: "Izquierda (Tercer botón)"
|
||||
STR_HW_RIGHT_LABEL: "Derecha (Cuarto botón)"
|
||||
STR_GO_TO_PERCENT: "Ir a %"
|
||||
STR_GO_HOME_BUTTON: "Volver a inicio"
|
||||
STR_SYNC_PROGRESS: "Progreso de síncronización"
|
||||
STR_DELETE_CACHE: "Borrar cache del libro"
|
||||
STR_CHAPTER_PREFIX: "Capítulo:"
|
||||
STR_PAGES_SEPARATOR: " Páginas |"
|
||||
STR_BOOK_PREFIX: "Libro:"
|
||||
STR_KBD_SHIFT: "shift"
|
||||
STR_KBD_SHIFT_CAPS: "SHIFT"
|
||||
STR_KBD_LOCK: "BLOQUEAR"
|
||||
STR_CALIBRE_URL_HINT: "Para calibre, agregue /opds a su urL"
|
||||
STR_PERCENT_STEP_HINT: "Izquierda/Derecha: 1% Arriba/Abajo: 10%"
|
||||
STR_SYNCING_TIME: "Tiempo de síncronización..."
|
||||
STR_CALC_HASH: "Calculando hash del documento..."
|
||||
STR_HASH_FAILED: "No se pudo calcular el hash del documento"
|
||||
STR_FETCH_PROGRESS: "Recuperando progreso remoto..."
|
||||
STR_UPLOAD_PROGRESS: "Subiendo progreso..."
|
||||
STR_NO_CREDENTIALS_MSG: "No se han configurado credenciales"
|
||||
STR_KOREADER_SETUP_HINT: "Configure una cuenta de KOReader en la configuración"
|
||||
STR_PROGRESS_FOUND: "¡Progreso encontrado!"
|
||||
STR_REMOTE_LABEL: "Remoto"
|
||||
STR_LOCAL_LABEL: "Local"
|
||||
STR_PAGE_OVERALL_FORMAT: "Página %d, %.2f%% Completada"
|
||||
STR_PAGE_TOTAL_OVERALL_FORMAT: "Página %d / %d, %.2f% Completada"
|
||||
STR_DEVICE_FROM_FORMAT: " De: %s"
|
||||
STR_APPLY_REMOTE: "Aplicar progreso remoto"
|
||||
STR_UPLOAD_LOCAL: "Subir progreso local"
|
||||
STR_NO_REMOTE_MSG: "No se encontró progreso remoto"
|
||||
STR_UPLOAD_PROMPT: "Subir posicion actual?"
|
||||
STR_UPLOAD_SUCCESS: "¡Progreso subido!"
|
||||
STR_SYNC_FAILED_MSG: "Fallo de síncronización"
|
||||
STR_SECTION_PREFIX: "Seccion"
|
||||
STR_UPLOAD: "Subir"
|
||||
STR_BOOK_S_STYLE: "Estilo del libro"
|
||||
STR_EMBEDDED_STYLE: "Estilo integrado"
|
||||
STR_OPDS_SERVER_URL: "URL del servidor OPDS"
|
||||
Reference in New Issue
Block a user