+ = $escape($translate('Markdown Content Migration')) ?>
+ = $escape($translate('Preview and convert legacy AseqBase Markdown content to sanitized HTML for TinyMCE. PHP code is never stored in content.')) ?>
+
+
+ = $escape($message) ?>
+
+
+
+ = $escape($translate('Safety notice')) ?>
+ = $escape($translate('Test this migration on a local database backup first. Mixed HTML and Markdown, unsupported directives, and content edited after migration are never overwritten automatically.')) ?>
+
+
+
+ $value): ?>
+
= $escape($translate($label)) ?>= (int)$value ?>
+
+
+
+
+
+ = $escape($translate('Dry-run samples')) ?>
+
+ = $escape($translate('No eligible or exceptional content records were found.')) ?>
+
+
+
+
+ | = $escape($translate('ID')) ?> |
+ = $escape($translate('Title')) ?> |
+ = $escape($translate('Detected format')) ?> |
+ = $escape($translate('Original content')) ?> |
+ = $escape($translate('Converted preview')) ?> |
+
+
+
+
+
+ | = (int)$sample['Id'] ?> |
+ = $escape($sample['Title']) ?> |
+ = $escape($translate($formatLabels[$sample['Format']] ?? ucfirst($sample['Format']))) ?> = $escape($translateIssue($sample['Issue'])) ?> |
+ = $escape($sample['Original']) ?> |
+ = $sample['Converted'] ?? $escape($translate('Skipped for manual review')) ?> |
+
+
+
+
+
+
+ AdminView)(
+ fn() => $renderMigration($input),
+ ['Image' => 'exchange', 'Title' => 'Markdown Content Migration']
+ );
+};
+
+(new Router())->if(\_::$User->HasAccess(\_::$User->AdminAccess))
+ ->Get(fn() => $showMigration())
+ ->Post(fn() => $showMigration(receivePost() ?: []))
+ ->Default(fn() => response($renderMigration(receive() ?: [])))
+ ->Handle();
diff --git a/translations/PAS_TinyMCE_Translations_EN_FA.xlsx b/translations/PAS_TinyMCE_Translations_EN_FA.xlsx
index 022dca7..6c0f50d 100644
Binary files a/translations/PAS_TinyMCE_Translations_EN_FA.xlsx and b/translations/PAS_TinyMCE_Translations_EN_FA.xlsx differ
diff --git a/translations/tinymce-en-fa.csv b/translations/tinymce-en-fa.csv
index 7db7845..7f8a2a6 100644
--- a/translations/tinymce-en-fa.csv
+++ b/translations/tinymce-en-fa.csv
@@ -81,3 +81,46 @@ EN,FA
"Attach","پیوست"
"Search","جستوجو"
"Default","پیشفرض"
+"Markdown Content Migration","مهاجرت محتوای مارکداون"
+"Preview and convert legacy AseqBase Markdown content to sanitized HTML for TinyMCE. PHP code is never stored in content.","پیشنمایش و تبدیل محتوای قدیمی مارکداون AseqBase به HTML امن برای TinyMCE. هیچ کد PHP در محتوا ذخیره نمیشود."
+"Safety notice","نکته ایمنی"
+"Test this migration on a local database backup first. Mixed HTML and Markdown, unsupported directives, and content edited after migration are never overwritten automatically.","این مهاجرت را ابتدا روی نسخه پشتیبان دیتابیس محلی آزمایش کنید. محتوای ترکیبی HTML و مارکداون، دستورهای پشتیبانینشده و محتوایی که پس از مهاجرت ویرایش شده باشد هرگز بهصورت خودکار بازنویسی نمیشود."
+"Total content","کل محتوا"
+"Eligible","قابل مهاجرت"
+"Markdown","مارکداون"
+"Plain text","متن ساده"
+"Existing HTML","HTML موجود"
+"Mixed content","محتوای ترکیبی"
+"Unsupported content","محتوای پشتیبانینشده"
+"Active backups","پشتیبانهای فعال"
+"Edited after migration","ویرایششده پس از مهاجرت"
+"Apply next migration batch","اجرای گروه بعدی مهاجرت"
+"Original content and update time are saved in a dedicated backup table before each change.","پیش از هر تغییر، محتوای اصلی و زمان بهروزرسانی در جدول پشتیبان اختصاصی ذخیره میشود."
+"Batch size","اندازه گروه"
+"Type MIGRATE to confirm","برای تأیید عبارت MIGRATE را وارد کنید"
+"Apply migration batch","اجرای گروه مهاجرت"
+"Rollback last migration batch","بازگردانی آخرین گروه مهاجرت"
+"Records edited after migration are protected and will not be overwritten.","رکوردهایی که پس از مهاجرت ویرایش شدهاند محافظت میشوند و بازنویسی نخواهند شد."
+"Type ROLLBACK to confirm","برای تأیید عبارت ROLLBACK را وارد کنید"
+"Restore from migration backup","بازیابی از پشتیبان مهاجرت"
+"Dry-run samples","نمونههای پیشنمایش آزمایشی"
+"No eligible or exceptional content records were found.","هیچ محتوای قابل مهاجرت یا استثنایی پیدا نشد."
+"ID","شناسه"
+"Detected format","قالب تشخیصدادهشده"
+"Original content","محتوای اصلی"
+"Converted preview","پیشنمایش تبدیلشده"
+"Skipped for manual review","برای بررسی دستی رد شد"
+"Mixed","ترکیبی"
+"Unsupported","پشتیبانینشده"
+"%d content records were migrated. Run another batch until Eligible becomes zero.","%d رکورد محتوا مهاجرت کرد. اجرای گروهها را تا صفر شدن تعداد قابل مهاجرت ادامه دهید."
+"%d content records were restored. %d edited records were protected and skipped.","%d رکورد محتوا بازیابی شد. %d رکورد ویرایششده محافظت و رد شد."
+"The migration operation failed:","عملیات مهاجرت ناموفق بود:"
+"Type MIGRATE in the confirmation field before applying the migration.","پیش از اجرای مهاجرت عبارت MIGRATE را در فیلد تأیید وارد کنید."
+"Type ROLLBACK in the confirmation field before restoring content.","پیش از بازیابی محتوا عبارت ROLLBACK را در فیلد تأیید وارد کنید."
+"Empty","خالی"
+"HTML and Markdown are mixed in this record.","در این رکورد HTML و مارکداون با هم ترکیب شدهاند."
+"A legacy button contains an unsupported URL.","یکی از دکمههای قدیمی دارای آدرس پشتیبانینشده است."
+"Unsupported custom markup:","نشانهگذاری سفارشی پشتیبانینشده:"
+"Content changed while the migration was running. No records were committed.","هنگام اجرای مهاجرت محتوا تغییر کرد. هیچ رکوردی ثبت نشد."
+"Content changed while the rollback was running. No records were committed.","هنگام اجرای بازگردانی محتوا تغییر کرد. هیچ رکوردی ثبت نشد."
+"The resolved database table name is invalid.","نام جدول دیتابیس معتبر نیست."