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.5 KiB
JSON
117 lines
4.5 KiB
JSON
{
|
||
"common": {
|
||
"retry": "Retry",
|
||
"cancel": "Cancel",
|
||
"back": "Back",
|
||
"error": "Error",
|
||
"loading": "Loading…",
|
||
"search": "Search",
|
||
"clear_search": "Clear search"
|
||
},
|
||
"welcome": {
|
||
"tagline": "Intelligent Document Processing",
|
||
"description": "Ingest documents, run OCR, extract metadata with AI, and route files to your cloud storage — all in one seamless pipeline.",
|
||
"get_started": "Get Started",
|
||
"hint": "Connect to your self-hosted or cloud DocuElevate server.",
|
||
"feature_ocr_title": "OCR & Text Extraction",
|
||
"feature_ocr_desc": "Convert scanned PDFs and images into fully searchable text automatically.",
|
||
"feature_ai_title": "AI Metadata Extraction",
|
||
"feature_ai_desc": "AI classifies documents and pulls out key fields like dates, amounts, and subjects.",
|
||
"feature_cloud_title": "Multi-Cloud Storage",
|
||
"feature_cloud_desc": "Route processed files to Dropbox, Google Drive, OneDrive, S3, Nextcloud, and more."
|
||
},
|
||
"login": {
|
||
"server_url": "Server URL",
|
||
"server_url_placeholder": "https://your-docuelevate-server.com",
|
||
"sign_in_sso": "Sign in with SSO",
|
||
"scan_qr": "📱 Scan QR Code to Login",
|
||
"hint": "Sign in via SSO or scan a QR code from the web app.",
|
||
"back": "← Back",
|
||
"or": "or",
|
||
"server_url_required": "Server URL required",
|
||
"server_url_required_msg": "Please enter the URL of your DocuElevate server.",
|
||
"invalid_url": "Invalid URL",
|
||
"invalid_url_msg": "The server URL must start with http:// or https://",
|
||
"sign_in_failed": "Sign-in failed",
|
||
"qr_login_failed": "QR Login Failed"
|
||
},
|
||
"upload": {
|
||
"camera": "Camera",
|
||
"photos": "Photos",
|
||
"files": "Files",
|
||
"camera_access_title": "Camera access required",
|
||
"camera_access_msg": "Please grant camera access in Settings to capture documents.",
|
||
"photo_access_title": "Photo library access required",
|
||
"photo_access_msg": "Please grant photo library access in Settings to select images.",
|
||
"file_picker_error": "File picker error",
|
||
"file_picker_error_msg": "Could not open file picker",
|
||
"empty_title": "Tap Camera, Photos, or Files to upload a document.",
|
||
"empty_hint": "You can also share files from other apps directly to DocuElevate.",
|
||
"sign_in_required": "Please sign in to upload documents.",
|
||
"status_queued": "Queued for processing…",
|
||
"status_processing": "Processing…",
|
||
"status_completed": "Processed",
|
||
"status_failed": "Processing failed",
|
||
"status_duplicate": "Duplicate – already processed",
|
||
"tap_retry": "Tap to retry",
|
||
"retry_title": "Retry Upload",
|
||
"retry_msg": "Do you want to retry uploading \"{filename}\"?",
|
||
"capture_label": "Capture document with camera",
|
||
"photo_label": "Select photo from library",
|
||
"file_label": "Pick file from device"
|
||
},
|
||
"files": {
|
||
"title": "My Documents",
|
||
"search_placeholder": "Search documents…",
|
||
"empty_title": "No documents yet.",
|
||
"empty_hint": "Upload a document from the Upload tab to get started.",
|
||
"search_empty": "No documents match your search.",
|
||
"search_empty_hint": "Try a different search term.",
|
||
"view_details": "View details for {filename}"
|
||
},
|
||
"file_detail": {
|
||
"title": "File Details",
|
||
"back": "Back to Files",
|
||
"file_size": "File Size",
|
||
"mime_type": "MIME Type",
|
||
"uploaded": "Uploaded",
|
||
"file_hash": "File Hash",
|
||
"last_step": "Last Step",
|
||
"total_steps": "Total Steps",
|
||
"processing_log": "Processing Log",
|
||
"no_logs": "No processing logs yet.",
|
||
"file_not_found": "File not found"
|
||
},
|
||
"profile": {
|
||
"title": "Profile",
|
||
"not_signed_in": "Not signed in",
|
||
"connection": "Connection",
|
||
"server": "Server",
|
||
"user_id": "User ID",
|
||
"legal": "Legal",
|
||
"privacy_policy": "Privacy Policy",
|
||
"terms_of_service": "Terms of Service",
|
||
"imprint": "Imprint",
|
||
"sign_out": "Sign out",
|
||
"sign_out_title": "Sign out",
|
||
"sign_out_msg": "Are you sure you want to sign out?",
|
||
"delete_account": "Delete Account",
|
||
"delete_account_title": "Delete Account",
|
||
"delete_account_msg": "This will permanently delete your account and all associated data. This action cannot be undone.",
|
||
"could_not_open": "Could not open the {page}. Please try again.",
|
||
"admin": "Admin",
|
||
"settings": "Settings",
|
||
"language": "Language"
|
||
},
|
||
"legal": {
|
||
"privacy_policy": "Privacy Policy",
|
||
"terms": "Terms",
|
||
"imprint": "Imprint"
|
||
},
|
||
"tabs": {
|
||
"upload": "Upload",
|
||
"files": "Files",
|
||
"profile": "Profile"
|
||
}
|
||
}
|