3b5ca04ebc
- Add LocaleProvider + useLocale() hook with AsyncStorage persistence to mobile i18n - Replace all hardcoded English strings in every screen with t() calls - Add missing profile.settings/language keys to all 5 translation files (en/de/es/fr/it) - Wrap app root in LocaleProvider; apply server preferred_language on login in AuthGuard - Tab labels and header titles now re-render on language switch - ProfileScreen: use useLocale() context, sync language to server via POST /api/i18n/language - Backend: add preferred_language field to GET /api/mobile/whoami response - Mobile API: add preferred_language to WhoAmIResponse type + setServerLanguage() method - Tests: add test_whoami_returns_preferred_language and test_whoami_no_profile_preferred_language_is_null - Docs: update MobileApp.md with language sync priority and whoami response format Language priority: server preference > AsyncStorage > device locale > English fallback Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
117 lines
4.9 KiB
JSON
117 lines
4.9 KiB
JSON
{
|
||
"common": {
|
||
"retry": "Reintentar",
|
||
"cancel": "Cancelar",
|
||
"back": "Atrás",
|
||
"error": "Error",
|
||
"loading": "Cargando…",
|
||
"search": "Buscar",
|
||
"clear_search": "Borrar búsqueda"
|
||
},
|
||
"welcome": {
|
||
"tagline": "Procesamiento Inteligente de Documentos",
|
||
"description": "Ingiere documentos, ejecuta OCR, extrae metadatos con IA y envía archivos a tu almacenamiento en la nube — todo en una sola línea de trabajo.",
|
||
"get_started": "Comenzar",
|
||
"hint": "Conéctate a tu servidor DocuElevate autoalojado o en la nube.",
|
||
"feature_ocr_title": "OCR y Extracción de Texto",
|
||
"feature_ocr_desc": "Convierte PDFs e imágenes escaneadas en texto completamente buscable automáticamente.",
|
||
"feature_ai_title": "Extracción de Metadatos con IA",
|
||
"feature_ai_desc": "La IA clasifica documentos y extrae campos clave como fechas, montos y asuntos.",
|
||
"feature_cloud_title": "Almacenamiento Multi-Nube",
|
||
"feature_cloud_desc": "Envía archivos procesados a Dropbox, Google Drive, OneDrive, S3, Nextcloud y más."
|
||
},
|
||
"login": {
|
||
"server_url": "URL del Servidor",
|
||
"server_url_placeholder": "https://tu-servidor-docuelevate.com",
|
||
"sign_in_sso": "Iniciar sesión con SSO",
|
||
"scan_qr": "📱 Escanear código QR para iniciar sesión",
|
||
"hint": "Inicia sesión mediante SSO o escanea un código QR desde la app web.",
|
||
"back": "← Atrás",
|
||
"or": "o",
|
||
"server_url_required": "URL del servidor requerida",
|
||
"server_url_required_msg": "Por favor ingresa la URL de tu servidor DocuElevate.",
|
||
"invalid_url": "URL inválida",
|
||
"invalid_url_msg": "La URL del servidor debe comenzar con http:// o https://",
|
||
"sign_in_failed": "Error al iniciar sesión",
|
||
"qr_login_failed": "Error en inicio de sesión QR"
|
||
},
|
||
"upload": {
|
||
"camera": "Cámara",
|
||
"photos": "Fotos",
|
||
"files": "Archivos",
|
||
"camera_access_title": "Acceso a la cámara requerido",
|
||
"camera_access_msg": "Permite el acceso a la cámara en Ajustes para capturar documentos.",
|
||
"photo_access_title": "Acceso a la biblioteca de fotos requerido",
|
||
"photo_access_msg": "Permite el acceso a la biblioteca de fotos en Ajustes para seleccionar imágenes.",
|
||
"file_picker_error": "Error del selector de archivos",
|
||
"file_picker_error_msg": "No se pudo abrir el selector de archivos",
|
||
"empty_title": "Toca Cámara, Fotos o Archivos para subir un documento.",
|
||
"empty_hint": "También puedes compartir archivos desde otras apps directamente a DocuElevate.",
|
||
"sign_in_required": "Inicia sesión para subir documentos.",
|
||
"status_queued": "En cola para procesamiento…",
|
||
"status_processing": "Procesando…",
|
||
"status_completed": "Procesado",
|
||
"status_failed": "Procesamiento fallido",
|
||
"status_duplicate": "Duplicado – ya procesado",
|
||
"tap_retry": "Toca para reintentar",
|
||
"retry_title": "Reintentar Subida",
|
||
"retry_msg": "¿Deseas reintentar la subida de \"{filename}\"?",
|
||
"capture_label": "Capturar documento con la cámara",
|
||
"photo_label": "Seleccionar foto de la biblioteca",
|
||
"file_label": "Seleccionar archivo del dispositivo"
|
||
},
|
||
"files": {
|
||
"title": "Mis Documentos",
|
||
"search_placeholder": "Buscar documentos…",
|
||
"empty_title": "Aún no hay documentos.",
|
||
"empty_hint": "Sube un documento desde la pestaña Subir para comenzar.",
|
||
"search_empty": "Ningún documento coincide con tu búsqueda.",
|
||
"search_empty_hint": "Intenta con otro término de búsqueda.",
|
||
"view_details": "Ver detalles de {filename}"
|
||
},
|
||
"file_detail": {
|
||
"title": "Detalles del Archivo",
|
||
"back": "Volver a Archivos",
|
||
"file_size": "Tamaño",
|
||
"mime_type": "Tipo MIME",
|
||
"uploaded": "Subido",
|
||
"file_hash": "Hash del Archivo",
|
||
"last_step": "Último Paso",
|
||
"total_steps": "Pasos Totales",
|
||
"processing_log": "Registro de Procesamiento",
|
||
"no_logs": "Aún no hay registros de procesamiento.",
|
||
"file_not_found": "Archivo no encontrado"
|
||
},
|
||
"profile": {
|
||
"title": "Perfil",
|
||
"not_signed_in": "No has iniciado sesión",
|
||
"connection": "Conexión",
|
||
"server": "Servidor",
|
||
"user_id": "ID de Usuario",
|
||
"legal": "Legal",
|
||
"privacy_policy": "Política de Privacidad",
|
||
"terms_of_service": "Términos de Servicio",
|
||
"imprint": "Aviso Legal",
|
||
"sign_out": "Cerrar sesión",
|
||
"sign_out_title": "Cerrar sesión",
|
||
"sign_out_msg": "¿Estás seguro de que deseas cerrar sesión?",
|
||
"delete_account": "Eliminar Cuenta",
|
||
"delete_account_title": "Eliminar Cuenta",
|
||
"delete_account_msg": "Esto eliminará permanentemente tu cuenta y todos los datos asociados. Esta acción no se puede deshacer.",
|
||
"could_not_open": "No se pudo abrir {page}. Inténtalo de nuevo.",
|
||
"admin": "Admin",
|
||
"settings": "Configuración",
|
||
"language": "Idioma"
|
||
},
|
||
"legal": {
|
||
"privacy_policy": "Privacidad",
|
||
"terms": "Términos",
|
||
"imprint": "Aviso Legal"
|
||
},
|
||
"tabs": {
|
||
"upload": "Subir",
|
||
"files": "Archivos",
|
||
"profile": "Perfil"
|
||
}
|
||
}
|