- Backend:
- Add address column to tickets and migration script
- Create guest users when user_id is missing; accept user_name and address
- Normalize stored image paths and expose absolute image_url
- Introduce utils for path normalization and ticket serialization
- Add CORS configuration for dashboard/emulator origins
- Tickets API:
- Serialize via ticket_to_dict with consistent schema
- Change status update to PATCH /api/tickets/{id}/status with JSON body
- Add DELETE /api/tickets/{id} with safe file removal
- Dashboard:
- Fetch tickets from backend, show thumbnails, absolute image URLs
- Status select + PATCH updates, toasts for feedback
- Add i18n key btn.viewDetails
- Mobile app:
- Persist device user_id via SharedPreferences
- Fetch and merge API tickets; prefer network imageUrl
- Submit user_name and address; delete via API when available
- Make location acquisition robust with fallbacks and non-blocking UX
- Android/deps:
- Disable Geolocator NMEA listener to prevent crashes
- Downgrade geolocator to ^11.0.0 for stability
BREAKING CHANGE:
- Status endpoint changed from PATCH /api/tickets/{id}?new_status=... to
PATCH /api/tickets/{id}/status with JSON body: {"status":"in_progress"}.
- /api/tickets and /api/tickets/{id} responses now use "id" (replacing
"ticket_id"), include "image_url", and normalize fields for clients. Update
consumers to use the new schema.
157 lines
6.3 KiB
JSON
157 lines
6.3 KiB
JSON
{
|
|
"app.name": "FixMate",
|
|
"nav.report": "Lapor",
|
|
"nav.map": "Peta",
|
|
"nav.myReports": "Laporan Saya",
|
|
"nav.settings": "Tetapan",
|
|
"btn.capture": "Tangkap",
|
|
"btn.gallery": "Galeri",
|
|
"btn.camera": "Kamera",
|
|
"capture.prompt": "Ambil gambar isu",
|
|
"btn.next": "Seterusnya",
|
|
"btn.submit": "Hantar",
|
|
"btn.save": "Simpan",
|
|
"btn.cancel": "Batal",
|
|
"btn.retake": "Ambil Semula",
|
|
"btn.delete": "Padam",
|
|
"btn.clearAll": "Kosongkan Semua",
|
|
"btn.changeStatus": "Tukar Status",
|
|
"btn.view": "Lihat",
|
|
"btn.details": "Butiran",
|
|
"btn.viewDetails": "Lihat butiran",
|
|
"btn.retry": "Cuba Semula",
|
|
"btn.allow": "Benarkan",
|
|
"btn.deny": "Tolak",
|
|
"btn.confirm": "Sahkan",
|
|
"btn.close": "Tutup",
|
|
"btn.openMap": "Buka Peta",
|
|
"btn.useSuggestion": "Guna Cadangan",
|
|
"btn.keepManual": "Kekal Manual",
|
|
"btn.apply": "Guna",
|
|
"btn.reset": "Tetap Semula",
|
|
"btn.filter": "Tapis",
|
|
"btn.ok": "OK",
|
|
"btn.yes": "Ya",
|
|
"btn.no": "Tidak",
|
|
"label.category": "Kategori",
|
|
"label.severity": "Tahap",
|
|
"label.status": "Status",
|
|
"label.notes": "Nota",
|
|
"label.address": "Alamat",
|
|
"label.location": "Lokasi",
|
|
"label.latitude": "Latitud",
|
|
"label.longitude": "Longitud",
|
|
"label.accuracy": "Ketepatan",
|
|
"label.timestamp": "Masa",
|
|
"label.deviceId": "ID Peranti",
|
|
"label.source": "Sumber",
|
|
"label.aiSuggestion": "Cadangan AI",
|
|
"status.submitted": "Dihantar",
|
|
"status.in_progress": "Dalam Proses",
|
|
"status.fixed": "Selesai",
|
|
"severity.high": "Tinggi",
|
|
"severity.medium": "Sederhana",
|
|
"severity.low": "Rendah",
|
|
"category.pothole": "Lubang Jalan",
|
|
"category.streetlight": "Lampu Jalan",
|
|
"category.signage": "Papan Tanda",
|
|
"category.trash": "Sampah",
|
|
"category.drainage": "Perparitan",
|
|
"category.other": "Lain-lain",
|
|
"filter.title": "Penapis",
|
|
"filter.category": "Kategori",
|
|
"filter.severity": "Tahap",
|
|
"filter.status": "Status",
|
|
"filter.dateRange": "Julat Tarikh",
|
|
"filter.showOnlyMine": "Tunjuk Milik Saya",
|
|
"map.legend": "Petunjuk Peta",
|
|
"map.noReports": "Tiada laporan",
|
|
"map.clustered": "Berkelompok",
|
|
"toast.reportSaved": "Laporan disimpan",
|
|
"toast.reportDeleted": "Laporan dipadam",
|
|
"toast.storageCleared": "Storan dikosongkan",
|
|
"confirm.deleteReport.title": "Padam laporan?",
|
|
"confirm.deleteReport.message": "Tindakan ini tidak boleh dibuat asal.",
|
|
"confirm.clearData.title": "Kosongkan semua data?",
|
|
"confirm.clearData.message": "Ini akan memadam semua laporan tempatan.",
|
|
"settings.language": "Bahasa",
|
|
"settings.diagnostics": "Diagnostik",
|
|
"settings.theme": "Tema",
|
|
"settings.theme.light": "Terang",
|
|
"settings.theme.dark": "Gelap",
|
|
"lang.en": "English",
|
|
"lang.ms": "Bahasa Malaysia",
|
|
"welcome.title": "Nampak. Tangkap. Baiki.",
|
|
"welcome.subtitle": "Lapor isu bandar dalam beberapa saat — bantu pasukan bertindak lebih pantas.",
|
|
"cta.continueGuest": "Teruskan sebagai tetamu",
|
|
"cta.signIn": "Log masuk",
|
|
"cta.skip": "Langkau",
|
|
"cta.next": "Seterusnya",
|
|
"cta.getStarted": "Mula",
|
|
"onboarding.header": "Selamat datang ke FixMate",
|
|
"onboarding.title1": "Tangkap pantas",
|
|
"onboarding.body1": "Ambil gambar dan hantar dalam kurang satu minit.",
|
|
"onboarding.title2": "Peta yang jelas",
|
|
"onboarding.body2": "Lihat isu di sekitar anda dengan pengelompokan pintar.",
|
|
"onboarding.title3": "Jejak kemajuan",
|
|
"onboarding.body3": "Ikuti kemas kini status apabila kerja disiapkan.",
|
|
"auth.title": "Log masuk",
|
|
"auth.signInWithApple": "Log masuk dengan Apple",
|
|
"auth.signInWithGoogle": "Log masuk dengan Google",
|
|
"auth.comingSoon": "Akan datang",
|
|
"welcome.title": "Nampak. Tangkap. Baiki.",
|
|
"welcome.subtitle": "Lapor isu bandar dalam beberapa saat dengan pengesanan berkuasa AI. Bantu mencipta komuniti yang lebih selamat dan lebih baik.",
|
|
"cta.continueGuest": "Teruskan sebagai Tetamu",
|
|
"cta.signIn": "Log Masuk",
|
|
"cta.skip": "Langkau buat masa ini",
|
|
"onboarding.header": "Selamat Datang ke FixMate",
|
|
"onboarding.title1": "Laporan Isu Pantas",
|
|
"onboarding.subtitle1": "Pengesanan Berkuasa AI",
|
|
"onboarding.body1": "Hanya ambil gambar mana-mana isu bandar - AI kami secara automatik mengenal pasti dan mengkategorikan masalah dalam beberapa saat.",
|
|
"onboarding.title2": "Pemetaan Bandar Pintar",
|
|
"onboarding.subtitle2": "Penglihatan Masa Nyata",
|
|
"onboarding.body2": "Lihat semua isu yang dilaporkan di peta interaktif dengan pengelompokan dan penapisan pintar.",
|
|
"onboarding.title3": "Jejak Kemajuan",
|
|
"onboarding.subtitle3": "Kekal Maklum",
|
|
"onboarding.body3": "Ikuti status laporan anda dari penyerahan hingga penyelesaian. Bantu memperbaiki komuniti anda.",
|
|
"onboarding.skip": "Langkau",
|
|
"onboarding.next": "Seterusnya",
|
|
"onboarding.getStarted": "Mula",
|
|
"review.title": "Semak & Hantar",
|
|
"review.submit": "Hantar",
|
|
"review.aiAnalysis": "Analisis AI Selesai",
|
|
"review.aiConfidence": "Pengesanan pintar dengan keyakinan {0}%",
|
|
"review.useSuggestion": "Guna Cadangan AI",
|
|
"review.editManually": "Edit Secara Manual",
|
|
"review.category": "Kategori Isu",
|
|
"review.severity": "Tahap Keterukan",
|
|
"review.notes": "Nota Tambahan",
|
|
"review.notesHint": "Tambah sebarang butiran atau konteks tambahan...",
|
|
"review.location": "Butiran Lokasi",
|
|
"review.coordinates": "Koordinat",
|
|
"review.accuracy": "Ketepatan: {0}m",
|
|
"error.saving": "Ralat menyimpan laporan: {0}",
|
|
"error.imagePick": "Ralat memilih imej: {0}",
|
|
"error.location": "Tidak dapat mendapatkan lokasi. Sila cuba lagi.",
|
|
"error.imageProcessing": "Ralat memproses imej: {0}",
|
|
"capture.title": "Lapor Isu",
|
|
"capture.subtitle": "Lapor Isu Bandar",
|
|
"capture.description": "Ambil gambar mana-mana isu penyelenggaraan bandar seperti lubang jalan, lampu jalan rosak, atau papan tanda rosak.",
|
|
"capture.processing": "Memproses imej...",
|
|
"capture.takePhoto": "Ambil Gambar",
|
|
"capture.gallery": "Pilih dari Galeri",
|
|
"report.viewDetails": "Lihat Butiran",
|
|
"report.updateStatus": "Kemas Kini Status",
|
|
"report.delete": "Padam",
|
|
"report.comingSoon": "Akan Datang!",
|
|
"settings.loading": "Memuatkan...",
|
|
"settings.app": "Apl",
|
|
"settings.version": "v1.0.0",
|
|
"settings.account": "Akaun",
|
|
"settings.account.guest": "Mod Tetamu",
|
|
"btn.logout": "Log Keluar",
|
|
"confirm.logout.title": "Log keluar?",
|
|
"confirm.logout.message": "Anda akan dibawa kembali ke skrin selamat datang.",
|
|
"label.createdAt": "Dicipta Pada",
|
|
"error.clearData": "Gagal mengosongkan data"
|
|
} |