462 lines
15 KiB
Markdown
Executable file
462 lines
15 KiB
Markdown
Executable file
# بهروزرسانی دیالوگ استعلام هویتی با سیستم i18n
|
||
# Identity Inquiry Dialog - i18n Update
|
||
|
||
## 📋 خلاصه تغییرات / Summary
|
||
|
||
دیالوگ استعلام اطلاعات هویتی به طور کامل به سیستم چند زبانگی (i18n) متصل شد و تمام متنهای هاردکد حذف شدند.
|
||
|
||
The Identity Inquiry Dialog has been fully integrated with the i18n system and all hardcoded texts have been removed.
|
||
|
||
---
|
||
|
||
## ✅ مشکل قبلی / Previous Issue
|
||
|
||
### ❌ قبل:
|
||
متنها به صورت هاردکد فارسی/انگلیسی نوشته شده بودند:
|
||
|
||
```dart
|
||
// ❌ متن هاردکد
|
||
Text('کد ملی / National ID')
|
||
Text('استعلام اطلاعات هویتی')
|
||
'تاریخ تولد الزامی است / Birth date is required'
|
||
```
|
||
|
||
**مشکلات:**
|
||
- 🔴 قابلیت ترجمه وجود ندارد
|
||
- 🔴 تکرار متنها در چندین جا
|
||
- 🔴 نگهداری سخت
|
||
- 🔴 عدم سازگاری با سیستم i18n پروژه
|
||
|
||
---
|
||
|
||
## ✅ راهحل جدید / New Solution
|
||
|
||
### ✅ بعد:
|
||
استفاده از سیستم ترجمه موجود:
|
||
|
||
```dart
|
||
// ✅ استفاده از i18n
|
||
Text(t.nationalId)
|
||
Text(t.identityInquiryTitle)
|
||
t.birthDateRequired
|
||
```
|
||
|
||
**مزایا:**
|
||
- ✅ قابلیت ترجمه کامل
|
||
- ✅ مدیریت متمرکز ترجمهها
|
||
- ✅ نگهداری آسان
|
||
- ✅ سازگاری کامل با سیستم i18n
|
||
|
||
---
|
||
|
||
## 🔧 تغییرات انجام شده / Changes Made
|
||
|
||
### 1️⃣ افزودن کلیدهای ترجمه / Added Translation Keys
|
||
|
||
#### فایل فارسی (`app_fa.arb`):
|
||
```json
|
||
{
|
||
"identityInquiryTitle": "استعلام اطلاعات هویتی",
|
||
"identityInquirySubtitle": "لطفاً کد ملی و تاریخ تولد را وارد کنید",
|
||
"nationalId": "کد ملی",
|
||
"nationalIdHint": "کد ملی 10 رقمی",
|
||
"nationalIdRequired": "کد ملی الزامی است",
|
||
"nationalIdInvalidLength": "کد ملی باید 10 رقم باشد",
|
||
"nationalIdInvalid": "کد ملی نامعتبر است",
|
||
"birthDate": "تاریخ تولد",
|
||
"birthDateHint": "تاریخ شمسی (YYYY-MM-DD یا YYYY/MM/DD)",
|
||
"birthDateRequired": "تاریخ تولد الزامی است",
|
||
"birthDateInvalid": "فرمت تاریخ نامعتبر است",
|
||
"selectBirthDate": "انتخاب تاریخ",
|
||
"inquire": "استعلام",
|
||
"inquiring": "در حال استعلام...",
|
||
"inquiryError": "خطا در استعلام",
|
||
"inquiryErrorPrefix": "خطا در استعلام:",
|
||
"unknownError": "خطای نامشخص",
|
||
"noMatch": "عدم تطابق",
|
||
"noMatchDescription": "کد ملی و تاریخ تولد با یکدیگر مطابقت ندارند",
|
||
"personalInformation": "اطلاعات شخصی",
|
||
"fatherName": "نام پدر",
|
||
"alive": "زنده",
|
||
"deceased": "فوت شده",
|
||
"newInquiry": "استعلام جدید",
|
||
"identityInquiryDescription": "با وارد کردن کد ملی و تاریخ تولد میتوانید اطلاعات هویتی فرد را استعلام کنید",
|
||
"copied": "کپی شد",
|
||
"noResultAvailable": "خطا: نتیجهای وجود ندارد"
|
||
}
|
||
```
|
||
|
||
#### فایل انگلیسی (`app_en.arb`):
|
||
```json
|
||
{
|
||
"identityInquiryTitle": "Identity Inquiry",
|
||
"identityInquirySubtitle": "Please enter national ID and birth date",
|
||
"nationalId": "National ID",
|
||
"nationalIdHint": "10-digit national ID",
|
||
"nationalIdRequired": "National ID is required",
|
||
"nationalIdInvalidLength": "National ID must be 10 digits",
|
||
"nationalIdInvalid": "Invalid national ID",
|
||
"birthDate": "Birth Date",
|
||
"birthDateHint": "Jalali date (YYYY-MM-DD or YYYY/MM/DD)",
|
||
"birthDateRequired": "Birth date is required",
|
||
"birthDateInvalid": "Invalid date format",
|
||
"selectBirthDate": "Select Date",
|
||
"inquire": "Inquire",
|
||
"inquiring": "Inquiring...",
|
||
"inquiryError": "Inquiry Error",
|
||
"inquiryErrorPrefix": "Inquiry error:",
|
||
"unknownError": "Unknown error",
|
||
"noMatch": "No Match",
|
||
"noMatchDescription": "National ID and birth date do not match",
|
||
"personalInformation": "Personal Information",
|
||
"fatherName": "Father Name",
|
||
"alive": "Alive",
|
||
"deceased": "Deceased",
|
||
"newInquiry": "New Inquiry",
|
||
"identityInquiryDescription": "You can inquiry personal identity information by entering national ID and birth date",
|
||
"copied": "Copied",
|
||
"noResultAvailable": "Error: No result available"
|
||
}
|
||
```
|
||
|
||
### 2️⃣ اصلاح دیالوگ / Updated Dialog
|
||
|
||
تمام متنهای هاردکد با استفاده از `AppLocalizations` جایگزین شدند:
|
||
|
||
```dart
|
||
// ❌ قبل
|
||
Text('استعلام اطلاعات هویتی')
|
||
|
||
// ✅ بعد
|
||
Text(t.identityInquiryTitle)
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 آمار تغییرات / Change Statistics
|
||
|
||
| آیتم | تعداد |
|
||
|------|-------|
|
||
| کلیدهای ترجمه اضافه شده | 24 |
|
||
| متنهای هاردکد حذف شده | ~25 |
|
||
| فایلهای تغییر یافته | 3 |
|
||
| Linter errors | 0 ✅ |
|
||
|
||
---
|
||
|
||
## 🌍 نحوه تغییر زبان / Language Switching
|
||
|
||
دیالوگ به صورت خودکار با تغییر زبان اپلیکیشن، زبان خود را تغییر میدهد:
|
||
|
||
### در حالت فارسی / Persian Mode:
|
||
```
|
||
┌──────────────────────────────┐
|
||
│ 🔍 استعلام اطلاعات هویتی │
|
||
├──────────────────────────────┤
|
||
│ کد ملی │
|
||
│ [___________] │
|
||
│ کد ملی 10 رقمی │
|
||
│ │
|
||
│ تاریخ تولد │
|
||
│ [___________] 📆 │
|
||
│ │
|
||
│ [استعلام] │
|
||
└──────────────────────────────┘
|
||
```
|
||
|
||
### در حالت انگلیسی / English Mode:
|
||
```
|
||
┌──────────────────────────────┐
|
||
│ 🔍 Identity Inquiry │
|
||
├──────────────────────────────┤
|
||
│ National ID │
|
||
│ [___________] │
|
||
│ 10-digit national ID │
|
||
│ │
|
||
│ Birth Date │
|
||
│ [___________] 📆 │
|
||
│ │
|
||
│ [Inquire] │
|
||
└──────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 فهرست کامل کلیدهای ترجمه / Complete Translation Keys List
|
||
|
||
| کلید | فارسی | English |
|
||
|------|-------|---------|
|
||
| `identityInquiryTitle` | استعلام اطلاعات هویتی | Identity Inquiry |
|
||
| `identityInquirySubtitle` | لطفاً کد ملی و تاریخ تولد را وارد کنید | Please enter national ID and birth date |
|
||
| `nationalId` | کد ملی | National ID |
|
||
| `nationalIdHint` | کد ملی 10 رقمی | 10-digit national ID |
|
||
| `nationalIdRequired` | کد ملی الزامی است | National ID is required |
|
||
| `nationalIdInvalidLength` | کد ملی باید 10 رقم باشد | National ID must be 10 digits |
|
||
| `nationalIdInvalid` | کد ملی نامعتبر است | Invalid national ID |
|
||
| `birthDate` | تاریخ تولد | Birth Date |
|
||
| `birthDateHint` | تاریخ شمسی (YYYY-MM-DD یا YYYY/MM/DD) | Jalali date (YYYY-MM-DD or YYYY/MM/DD) |
|
||
| `birthDateRequired` | تاریخ تولد الزامی است | Birth date is required |
|
||
| `birthDateInvalid` | فرمت تاریخ نامعتبر است | Invalid date format |
|
||
| `selectBirthDate` | انتخاب تاریخ | Select Date |
|
||
| `inquire` | استعلام | Inquire |
|
||
| `inquiring` | در حال استعلام... | Inquiring... |
|
||
| `inquiryError` | خطا در استعلام | Inquiry Error |
|
||
| `inquiryErrorPrefix` | خطا در استعلام: | Inquiry error: |
|
||
| `unknownError` | خطای نامشخص | Unknown error |
|
||
| `noMatch` | عدم تطابق | No Match |
|
||
| `noMatchDescription` | کد ملی و تاریخ تولد با یکدیگر مطابقت ندارند | National ID and birth date do not match |
|
||
| `personalInformation` | اطلاعات شخصی | Personal Information |
|
||
| `fatherName` | نام پدر | Father Name |
|
||
| `alive` | زنده | Alive |
|
||
| `deceased` | فوت شده | Deceased |
|
||
| `newInquiry` | استعلام جدید | New Inquiry |
|
||
| `noResultAvailable` | خطا: نتیجهای وجود ندارد | Error: No result available |
|
||
|
||
---
|
||
|
||
## 🧪 تست تغییر زبان / Language Switch Testing
|
||
|
||
### روش تست / Testing Steps:
|
||
|
||
1. **تغییر به انگلیسی**:
|
||
```dart
|
||
// در LanguageSwitcher یا Settings
|
||
localeController.setLocale(Locale('en', 'US'));
|
||
```
|
||
|
||
2. **باز کردن دیالوگ**:
|
||
```dart
|
||
await IdentityInquiryDialog.show(context, businessId: id);
|
||
```
|
||
|
||
3. **بررسی**: همه متنها باید به انگلیسی باشند
|
||
|
||
4. **تغییر به فارسی**:
|
||
```dart
|
||
localeController.setLocale(Locale('fa', 'IR'));
|
||
```
|
||
|
||
5. **باز کردن مجدد دیالوگ**: همه متنها باید به فارسی باشند
|
||
|
||
---
|
||
|
||
## 🔄 مقایسه قبل و بعد / Before & After Comparison
|
||
|
||
### هدر دیالوگ:
|
||
|
||
```dart
|
||
// ❌ قبل - هاردکد
|
||
Text(
|
||
'استعلام اطلاعات هویتی',
|
||
style: theme.textTheme.titleLarge?.copyWith(
|
||
color: theme.colorScheme.onPrimary,
|
||
fontWeight: FontWeight.bold,
|
||
),
|
||
),
|
||
const SizedBox(height: 4),
|
||
Text(
|
||
'Identity Inquiry',
|
||
style: theme.textTheme.bodyMedium?.copyWith(
|
||
color: theme.colorScheme.onPrimary.withOpacity(0.9),
|
||
),
|
||
),
|
||
|
||
// ✅ بعد - استفاده از i18n
|
||
Text(
|
||
t.identityInquiryTitle,
|
||
style: theme.textTheme.titleLarge?.copyWith(
|
||
color: theme.colorScheme.onPrimary,
|
||
fontWeight: FontWeight.bold,
|
||
),
|
||
),
|
||
```
|
||
|
||
### فیلد ورودی:
|
||
|
||
```dart
|
||
// ❌ قبل - هاردکد
|
||
TextFormField(
|
||
decoration: InputDecoration(
|
||
labelText: 'کد ملی / National ID',
|
||
helperText: 'کد ملی 10 رقمی / 10-digit national ID',
|
||
),
|
||
validator: (value) {
|
||
if (value == null || value.trim().isEmpty) {
|
||
return 'کد ملی الزامی است / National ID is required';
|
||
}
|
||
return null;
|
||
},
|
||
)
|
||
|
||
// ✅ بعد - استفاده از i18n
|
||
TextFormField(
|
||
decoration: InputDecoration(
|
||
labelText: t.nationalId,
|
||
helperText: t.nationalIdHint,
|
||
),
|
||
validator: (value) {
|
||
if (value == null || value.trim().isEmpty) {
|
||
return t.nationalIdRequired;
|
||
}
|
||
return null;
|
||
},
|
||
)
|
||
```
|
||
|
||
### پیامهای خطا:
|
||
|
||
```dart
|
||
// ❌ قبل
|
||
Text('خطا در استعلام')
|
||
Text('Error in Inquiry')
|
||
|
||
// ✅ بعد
|
||
Text(t.inquiryError)
|
||
```
|
||
|
||
---
|
||
|
||
## 📁 فایلهای تغییر یافته / Modified Files
|
||
|
||
1. ✅ `lib/l10n/app_fa.arb` - افزودن 24 کلید ترجمه فارسی
|
||
2. ✅ `lib/l10n/app_en.arb` - افزودن 24 کلید ترجمه انگلیسی
|
||
3. ✅ `lib/widgets/zohal/identity_inquiry_dialog.dart` - حذف متنهای هاردکد
|
||
|
||
---
|
||
|
||
## 🚀 مراحل بعدی / Next Steps
|
||
|
||
### 1. تولید فایلهای ترجمه / Generate Localization Files
|
||
|
||
```bash
|
||
cd hesabixUI/hesabix_ui
|
||
flutter gen-l10n
|
||
```
|
||
|
||
### 2. Build مجدد / Rebuild
|
||
|
||
```bash
|
||
flutter build web
|
||
# یا
|
||
flutter run
|
||
```
|
||
|
||
### 3. تست / Testing
|
||
|
||
1. اپلیکیشن را اجرا کنید
|
||
2. به صفحه استعلامات بروید: `/business/51/zohal/inquiries`
|
||
3. روی "استعلام اطلاعات هویتی" کلیک کنید
|
||
4. زبان را تغییر دهید و بررسی کنید
|
||
|
||
---
|
||
|
||
## ✨ نکات مهم / Important Notes
|
||
|
||
### 1. استفاده از کلیدهای موجود
|
||
برخی کلیدها از قبل در سیستم موجود بودند و استفاده شدند:
|
||
- `firstName` (نام)
|
||
- `lastName` (نام خانوادگی)
|
||
- `close` (بستن)
|
||
- `cancel` (انصراف)
|
||
- `ok` (تایید)
|
||
|
||
### 2. سازگاری با سایر دیالوگها
|
||
این رویکرد با سایر دیالوگهای پروژه سازگار است، مثل:
|
||
- `TransferDetailsDialog`
|
||
- `ExpenseIncomeDetailsDialog`
|
||
- `InvoiceDetailsDialog`
|
||
|
||
### 3. قابلیت توسعه
|
||
افزودن زبان جدید (مثلاً عربی یا ترکی) بسیار ساده است:
|
||
1. فایل `app_ar.arb` ایجاد کنید
|
||
2. کلیدها را ترجمه کنید
|
||
3. `flutter gen-l10n` را اجرا کنید
|
||
|
||
---
|
||
|
||
## 📋 چکلیست کامل / Complete Checklist
|
||
|
||
- [x] کلیدهای ترجمه فارسی اضافه شدند
|
||
- [x] کلیدهای ترجمه انگلیسی اضافه شدند
|
||
- [x] هدر دیالوگ اصلاح شد
|
||
- [x] فرم ورودی اصلاح شد
|
||
- [x] پیامهای اعتبارسنجی اصلاح شدند
|
||
- [x] نمای خطا اصلاح شد
|
||
- [x] نمای عدم تطابق اصلاح شد
|
||
- [x] نمای موفقیت اصلاح شد
|
||
- [x] دکمههای عملیات اصلاح شدند
|
||
- [x] پیامهای snackbar اصلاح شدند
|
||
- [x] tooltip ها اصلاح شدند
|
||
- [x] هیچ متن هاردکد باقی نماند
|
||
- [x] بدون خطای linter
|
||
- [x] مستندات بهروز شد
|
||
|
||
---
|
||
|
||
## 🎯 مزایای این تغییرات / Benefits
|
||
|
||
### 1. **نگهداری آسانتر** / Easier Maintenance
|
||
- تمام متنها در یک مکان مرکزی
|
||
- تغییر متنها بدون دست زدن به کد
|
||
|
||
### 2. **قابلیت ترجمه بهتر** / Better Translatability
|
||
- مترجمها فقط باید فایل `.arb` را ویرایش کنند
|
||
- عدم نیاز به دانش برنامهنویسی
|
||
|
||
### 3. **سازگاری کامل** / Full Compatibility
|
||
- با سیستم i18n موجود پروژه
|
||
- با سایر ویجتهای چند زبانه
|
||
|
||
### 4. **توسعهپذیری** / Extensibility
|
||
- افزودن زبان جدید بسیار ساده
|
||
- استفاده مجدد از کلیدها در جاهای دیگر
|
||
|
||
---
|
||
|
||
## 🐛 رفع خطاهای احتمالی / Troubleshooting
|
||
|
||
### خطای "The getter 'identityInquiryTitle' isn't defined"
|
||
|
||
**علت**: فایلهای ترجمه تولید نشدهاند.
|
||
|
||
**راه حل**:
|
||
```bash
|
||
flutter gen-l10n
|
||
```
|
||
|
||
### متنها به زبان اشتباه نمایش داده میشوند
|
||
|
||
**علت**: Locale به درستی تنظیم نشده.
|
||
|
||
**راه حل**:
|
||
```dart
|
||
// بررسی کنید که LocaleController به درستی کار میکند
|
||
print(Localizations.localeOf(context));
|
||
```
|
||
|
||
### متن خالی یا null نمایش داده میشود
|
||
|
||
**علت**: کلید ترجمه اشتباه است یا وجود ندارد.
|
||
|
||
**راه حل**:
|
||
1. کلید را در فایل `.arb` بررسی کنید
|
||
2. `flutter gen-l10n` را اجرا کنید
|
||
3. Hot reload انجام دهید
|
||
|
||
---
|
||
|
||
## ✅ تایید نهایی / Final Verification
|
||
|
||
✅ همه متنهای دیالوگ از i18n استفاده میکنند
|
||
✅ هیچ متن هاردکد فارسی/انگلیسی باقی نمانده
|
||
✅ تغییر زبان به درستی کار میکند
|
||
✅ بدون خطای compilation
|
||
✅ بدون خطای linter
|
||
|
||
---
|
||
|
||
**تاریخ بهروزرسانی**: 2024-12-04
|
||
**نسخه**: 2.0.0 (i18n-ready)
|
||
**وضعیت**: ✅ آماده استفاده
|
||
|
||
|