Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/docs/IDENTITY_INQUIRY_DIALOG_I18N.md
2026-04-14 19:34:55 +03:30

15 KiB
Executable file
Raw Permalink Blame History

به‌روزرسانی دیالوگ استعلام هویتی با سیستم 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

❌ قبل:

متن‌ها به صورت هاردکد فارسی/انگلیسی نوشته شده بودند:

// ❌ متن هاردکد
Text('کد ملی / National ID')
Text('استعلام اطلاعات هویتی')
'تاریخ تولد الزامی است / Birth date is required'

مشکلات:

  • 🔴 قابلیت ترجمه وجود ندارد
  • 🔴 تکرار متن‌ها در چندین جا
  • 🔴 نگهداری سخت
  • 🔴 عدم سازگاری با سیستم i18n پروژه

✅ راه‌حل جدید / New Solution

✅ بعد:

استفاده از سیستم ترجمه موجود:

// ✅ استفاده از i18n
Text(t.nationalId)
Text(t.identityInquiryTitle)
t.birthDateRequired

مزایا:

  • ✅ قابلیت ترجمه کامل
  • ✅ مدیریت متمرکز ترجمه‌ها
  • ✅ نگهداری آسان
  • ✅ سازگاری کامل با سیستم i18n

🔧 تغییرات انجام شده / Changes Made

1️⃣ افزودن کلیدهای ترجمه / Added Translation Keys

فایل فارسی (app_fa.arb):

{
  "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):

{
  "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 جایگزین شدند:

// ❌ قبل
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. تغییر به انگلیسی:

    // در LanguageSwitcher یا Settings
    localeController.setLocale(Locale('en', 'US'));
    
  2. باز کردن دیالوگ:

    await IdentityInquiryDialog.show(context, businessId: id);
    
  3. بررسی: همه متن‌ها باید به انگلیسی باشند

  4. تغییر به فارسی:

    localeController.setLocale(Locale('fa', 'IR'));
    
  5. باز کردن مجدد دیالوگ: همه متن‌ها باید به فارسی باشند


🔄 مقایسه قبل و بعد / Before & After Comparison

هدر دیالوگ:

// ❌ قبل - هاردکد
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,
  ),
),

فیلد ورودی:

// ❌ قبل - هاردکد
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;
  },
)

پیام‌های خطا:

// ❌ قبل
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

cd hesabixUI/hesabix_ui
flutter gen-l10n

2. Build مجدد / Rebuild

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

  • کلیدهای ترجمه فارسی اضافه شدند
  • کلیدهای ترجمه انگلیسی اضافه شدند
  • هدر دیالوگ اصلاح شد
  • فرم ورودی اصلاح شد
  • پیام‌های اعتبارسنجی اصلاح شدند
  • نمای خطا اصلاح شد
  • نمای عدم تطابق اصلاح شد
  • نمای موفقیت اصلاح شد
  • دکمه‌های عملیات اصلاح شدند
  • پیام‌های snackbar اصلاح شدند
  • tooltip ها اصلاح شدند
  • هیچ متن هاردکد باقی نماند
  • بدون خطای linter
  • مستندات به‌روز شد

🎯 مزایای این تغییرات / Benefits

1. نگهداری آسان‌تر / Easier Maintenance

  • تمام متن‌ها در یک مکان مرکزی
  • تغییر متن‌ها بدون دست زدن به کد

2. قابلیت ترجمه بهتر / Better Translatability

  • مترجم‌ها فقط باید فایل .arb را ویرایش کنند
  • عدم نیاز به دانش برنامه‌نویسی

3. سازگاری کامل / Full Compatibility

  • با سیستم i18n موجود پروژه
  • با سایر ویجت‌های چند زبانه

4. توسعه‌پذیری / Extensibility

  • افزودن زبان جدید بسیار ساده
  • استفاده مجدد از کلیدها در جاهای دیگر

🐛 رفع خطاهای احتمالی / Troubleshooting

خطای "The getter 'identityInquiryTitle' isn't defined"

علت: فایل‌های ترجمه تولید نشده‌اند.

راه حل:

flutter gen-l10n

متن‌ها به زبان اشتباه نمایش داده می‌شوند

علت: Locale به درستی تنظیم نشده.

راه حل:

// بررسی کنید که 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)
وضعیت: ✅ آماده استفاده