* Add workspace webhooks and drop the unused automation webhook node. Give workspaces HMAC-signed outgoing webhooks for the post lifecycle, with retry, auto-pause, replay, and live logs, and keep HTTP Request as the only outbound automation node. * Tighten webhook controller and validation after review. Drop the redundant workspace redirects, prune logs without counting, and validate events/status with Rule::enum. * Move leftover webhook UI copy behind i18n. HTTP status phrases, delete-cancel, and validation attribute names were still English literals. * Build the webhook-paused email through Maizzle. The hand-written Blade skipped the shared layout, header, and footer used by the other mail templates. * Cover real webhook dispatch paths and restyle the webhook pages. * Ask for the shared delete keyword when confirming a webhook delete. The endpoint URL is a poor confirm string; posts and assets already use the common "delete" keyword. * Fix webhook review blockers so CI can go green. Drop leftover French automation keys, stop mutating Inertia log props, and show delivered_at instead of created_at. * Close the remaining webhook review gaps. Keep Echo log updates across infinite scroll, align the channel with the policy, persist log ids across retries, and fail unknown automation nodes without throwing. * Stop webhook delivery after disable and record last sent only on success. Queued jobs now skip paused or disabled endpoints unless the user replays, and changing the URL re-pings it first. * Limit webhooks to owners and admins, and encrypt signing secrets. Members can no longer create or inspect outgoing integrations, and secrets stay encrypted at rest. * Cover webhook secret hiding, skip-ping, and failed-delivery edges. * Send the full post on webhooks after labels and platforms are saved. * Fix webhook payloads for integer media ids and type webhook status. * Split the webhook show page into focused components. * Reset live webhook logs when switching endpoints. * Keep the newest webhook logs at the top after live merges. * Cast media item ids to string without the extra scalar check. * Add post.unscheduled webhooks and put the log id on the envelope. Unscheduling is now a first-class event, and receivers can send the delivery id back so we can find the matching log. * Translate webhook event names in the UI. * Make the webhook show page full-width and stop stacking flash toasts. * Translate remaining webhook UI copy in every locale. * Sign webhook pings and drop author email from the payload. * Send signed webhook tests after create instead of pinging on save. Create and update only block private URLs so the receiver can copy the secret first. The show page then sends a signed webhook.test with an object data envelope. * Polish webhook test UX and always mint the dispatch log id in the job. Keep send-test in the actions menu (its own group) and drop the leftover constructor param so retries reuse the serialized id instead of a caller-supplied one.
402 lines
21 KiB
PHP
402 lines
21 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
return [
|
|
'mobile_notice' => 'يعمل محرر الأتمتة بشكل أفضل على شاشة أكبر. افتحه على جهاز كمبيوتر مكتبي لإنشاء سير عملك.',
|
|
'title' => 'الأتمتة',
|
|
'default_name' => 'أتمتة جديدة',
|
|
|
|
'actions' => [
|
|
'new' => 'أتمتة جديدة',
|
|
'edit' => 'تعديل',
|
|
'save' => 'حفظ',
|
|
'activate' => 'تفعيل',
|
|
'pause' => 'إيقاف مؤقت',
|
|
'delete' => 'حذف',
|
|
'retry' => 'إعادة المحاولة',
|
|
'guide' => 'تعرّف على آلية العمل',
|
|
],
|
|
|
|
'tabs' => [
|
|
'build' => 'البناء',
|
|
'variables' => 'المتغيرات',
|
|
'test' => 'اختبار',
|
|
],
|
|
|
|
'nav' => [
|
|
'workflow' => 'سير العمل',
|
|
'invocations' => 'عمليات التشغيل',
|
|
'metrics' => 'المقاييس',
|
|
'settings' => 'الإعدادات',
|
|
],
|
|
|
|
'settings' => [
|
|
'general' => 'عام',
|
|
'general_description' => 'إعادة تسمية هذه الأتمتة.',
|
|
'name_label' => 'الاسم',
|
|
'name_saved' => 'تمت إعادة تسمية الأتمتة.',
|
|
'status_title' => 'الحالة',
|
|
'status_description' => 'فعّلها لبدء تشغيلها، أو أوقفها مؤقتًا للتوقف.',
|
|
'activated_at' => 'تم التفعيل :date',
|
|
'paused_at' => 'تم الإيقاف المؤقت :date',
|
|
'created_at' => 'تم الإنشاء :date',
|
|
'danger_title' => 'منطقة الخطر',
|
|
'danger_description' => 'إجراءات لا يمكن التراجع عنها.',
|
|
'delete_title' => 'حذف هذه الأتمتة',
|
|
'delete_description' => 'يزيل الأتمتة وسجل تشغيلها نهائيًا.',
|
|
],
|
|
|
|
'status_run' => [
|
|
'pending' => 'قيد الانتظار',
|
|
'running' => 'قيد التشغيل',
|
|
'waiting' => 'في الانتظار',
|
|
'completed' => 'مكتمل',
|
|
'failed' => 'فشل',
|
|
'cancelled' => 'مُلغى',
|
|
],
|
|
|
|
'node_type' => [
|
|
'trigger' => 'مُشغّل',
|
|
'generate' => 'إنشاء محتوى',
|
|
'delay' => 'تأخير',
|
|
'condition' => 'شرط',
|
|
'publish' => 'نشر',
|
|
'end' => 'إنهاء',
|
|
'fetch_rss' => 'جلب RSS',
|
|
'http_request' => 'طلب HTTP',
|
|
],
|
|
|
|
'invocations' => [
|
|
'empty' => 'لا توجد عمليات تشغيل بعد.',
|
|
'refresh' => 'تحديث',
|
|
'search_placeholder' => 'البحث عبر معرّف التشغيل…',
|
|
'copied' => 'تم نسخ معرّف التشغيل.',
|
|
'loading' => 'جارٍ تحميل الخطوات…',
|
|
'no_steps' => 'لم يتم تسجيل أي خطوات.',
|
|
'load_error' => 'تعذر تحميل الخطوات.',
|
|
'steps' => '{0}لا خطوات|{1}خطوة واحدة|{2}خطوتان|[3,10]:count خطوات|[11,*]:count خطوة',
|
|
'filter' => [
|
|
'all' => 'جميع الحالات',
|
|
],
|
|
'columns' => [
|
|
'timestamp' => 'الطابع الزمني',
|
|
'run' => 'التشغيل',
|
|
'status' => 'الحالة',
|
|
'message' => 'آخر رسالة',
|
|
'duration' => 'المدة',
|
|
],
|
|
'summary' => [
|
|
'completed' => 'اكتمل سير العمل',
|
|
'failed' => 'فشل سير العمل',
|
|
'running' => 'سير العمل قيد التشغيل',
|
|
'cancelled' => 'تم إلغاء سير العمل',
|
|
'pending' => 'سير العمل قيد الانتظار',
|
|
],
|
|
],
|
|
|
|
'metrics' => [
|
|
'overview' => 'نظرة عامة',
|
|
'runs_over_time' => 'عمليات التشغيل عبر الزمن',
|
|
'posts_by_platform' => 'المنشورات حسب المنصة',
|
|
'no_posts' => 'لم يتم نشر أي منشورات في هذه الفترة.',
|
|
'cards' => [
|
|
'runs' => 'إجمالي عمليات التشغيل',
|
|
'completed' => 'مكتملة',
|
|
'failed' => 'فاشلة',
|
|
'in_progress' => 'قيد التنفيذ',
|
|
'success_rate' => 'معدل النجاح',
|
|
'avg_duration' => 'متوسط المدة',
|
|
'posts_created' => 'المنشورات المُنشأة',
|
|
],
|
|
'legend' => [
|
|
'started' => 'بدأت',
|
|
'completed' => 'اكتملت',
|
|
'failed' => 'فشلت',
|
|
],
|
|
],
|
|
|
|
'categories' => [
|
|
'sources' => 'المصادر',
|
|
'content' => 'المحتوى',
|
|
'flow' => 'التدفق',
|
|
'output' => 'الإخراج',
|
|
],
|
|
|
|
'variables' => [
|
|
'title' => 'متغيرات سير العمل',
|
|
'hint' => 'قيم قابلة لإعادة الاستخدام يُشار إليها في أي مكان عبر {{ variables.KEY }}. تُخزَّن مشفّرة.',
|
|
'empty' => 'لا توجد متغيرات بعد.',
|
|
'key' => 'المفتاح',
|
|
'value' => 'القيمة',
|
|
'key_placeholder' => 'API_KEY',
|
|
'value_placeholder' => 'القيمة',
|
|
'add' => 'متغير جديد',
|
|
],
|
|
|
|
'expr' => [
|
|
'trigger_event' => 'اسم حدث المُشغّل',
|
|
'trigger_fired_at' => 'وقت إطلاق المُشغّل',
|
|
'trigger_post_id' => 'معرّف المنشور المُشغِّل',
|
|
'trigger_post_content' => 'محتوى المنشور المُشغِّل',
|
|
'trigger_post_status' => 'حالة المنشور المُشغِّل',
|
|
'trigger_post_scheduled_at' => 'وقت جدولة المنشور',
|
|
'trigger_post_published_at' => 'وقت نشر المنشور',
|
|
'fetched_title' => 'عنوان العنصر المجلوب',
|
|
'fetched_link' => 'رابط العنصر المجلوب',
|
|
'fetched_date' => 'تاريخ نشر العنصر المجلوب',
|
|
'fetched_content' => 'المحتوى الكامل للعنصر المجلوب',
|
|
'fetched_description' => 'ملخص العنصر المجلوب',
|
|
'fetched_author' => 'كاتب العنصر المجلوب',
|
|
'fetched_image' => 'رابط صورة العنصر المجلوب',
|
|
'fetched_categories' => 'فئات العنصر المجلوب',
|
|
'fetched_enclosure' => 'وسائط العنصر المجلوب (صوت/فيديو/ملف)',
|
|
'fetched_pubdate' => 'تاريخ نشر العنصر المجلوب',
|
|
'fetched_http' => 'عنصر HTTP المجلوب (أضِف حقلًا)',
|
|
'generated_content' => 'محتوى المنشور المُنشأ بالذكاء الاصطناعي',
|
|
'generated_post_url' => 'رابط المنشور المُنشأ بالذكاء الاصطناعي',
|
|
'variable' => 'متغير سير العمل',
|
|
'now' => 'التاريخ والوقت الحالي',
|
|
],
|
|
|
|
'test' => [
|
|
'description' => 'يشغّل الأتمتة من البداية إلى النهاية باستخدام حمولة مُشغِّل مُصطنعة. مفيد للتحقق من كل عقدة دون انتظار الجدول أو الخلاصة الحقيقية.',
|
|
'starting' => 'جارٍ بدء تشغيل الاختبار…',
|
|
'in_progress' => 'قيد التنفيذ',
|
|
'completed' => 'مكتمل',
|
|
'failed' => 'فشل',
|
|
'waiting' => 'في الانتظار',
|
|
'close' => 'إغلاق',
|
|
'no_node_runs' => 'في انتظار بدء العقدة الأولى…',
|
|
'node_input' => 'المدخلات',
|
|
'node_output' => 'المخرجات',
|
|
'node_error' => 'خطأ',
|
|
'no_new_items' => 'لا توجد عناصر جديدة — لم يُشغَّل أي شيء لاحق.',
|
|
'error_starting' => 'تعذر بدء تشغيل الاختبار.',
|
|
'with_real_data' => 'ببيانات حقيقية',
|
|
'run' => 'تشغيل الاختبار',
|
|
'idle_hint' => 'اضغط على "تشغيل الاختبار" لتنفيذ الأتمتة من البداية إلى النهاية.',
|
|
'real_data_hint' => 'سيقوم هذا الاختبار بنشر المنشورات، وتقديم علامات الاستطلاع، وإطلاق تأثيرات جانبية خارجية.',
|
|
'dry_badge' => 'تشغيل تجريبي',
|
|
],
|
|
|
|
'status' => [
|
|
'draft' => 'مسودة',
|
|
'active' => 'نشط',
|
|
'paused' => 'متوقف مؤقتًا',
|
|
],
|
|
|
|
'index' => [
|
|
'empty_title' => 'لا توجد عمليات أتمتة بعد',
|
|
'empty_description' => 'أنشئ أول أتمتة لك لبدء النشر تلقائيًا.',
|
|
'columns' => [
|
|
'name' => 'الاسم',
|
|
'status' => 'الحالة',
|
|
'created' => 'تاريخ الإنشاء',
|
|
],
|
|
],
|
|
|
|
'form' => [
|
|
'activate_error_fallback' => 'تعذر تفعيل الأتمتة.',
|
|
'pause_error_fallback' => 'تعذر إيقاف الأتمتة مؤقتًا.',
|
|
'save_error_fallback' => 'تعذر حفظ الأتمتة.',
|
|
'save_success' => 'تم حفظ الأتمتة.',
|
|
'empty_canvas_title' => 'ابدأ ببناء أتمتتك',
|
|
'empty_canvas_description' => 'اسحب عقدة من اللوحة الجانبية للبدء.',
|
|
'name_placeholder' => 'أتمتة بلا عنوان',
|
|
],
|
|
|
|
'nodes' => [
|
|
'trigger' => 'مُشغّل',
|
|
'generate' => 'إنشاء',
|
|
'delay' => 'تأخير',
|
|
'condition' => 'شرط',
|
|
'publish' => 'نشر',
|
|
'end' => 'إنهاء',
|
|
'end_summary' => 'يوقف الأتمتة هنا',
|
|
'fetch_rss' => 'جلب RSS',
|
|
'http_request' => 'طلب HTTP',
|
|
'handles' => [
|
|
'items' => 'يحتوي على عناصر',
|
|
'no_items' => 'لا عناصر',
|
|
],
|
|
],
|
|
|
|
'config' => [
|
|
'select_placeholder' => 'اختر…',
|
|
'invalid_json' => 'هذا ليس JSON صالحًا بعد.',
|
|
'expand_editor' => 'توسيع المحرر',
|
|
'minimize_editor' => 'تصغير',
|
|
|
|
'trigger' => [
|
|
'type' => 'نوع المُشغّل',
|
|
'types' => [
|
|
'schedule' => 'جدولة',
|
|
'post_published' => 'عند نشر منشور',
|
|
'post_scheduled' => 'عند جدولة منشور',
|
|
],
|
|
'post_published_hint' => 'يعمل كلما تم نشر أي منشور في مساحة العمل هذه. يصبح المنشور المنشور متاحًا في {{ trigger.post }} للعقد اللاحقة.',
|
|
'post_scheduled_hint' => 'يعمل كلما تمت جدولة أي منشور في مساحة العمل هذه. يكون المنشور المجدول متاحًا في {{ trigger.post }}.',
|
|
|
|
'schedule' => [
|
|
'field' => 'فاصل المُشغّل',
|
|
'fields' => [
|
|
'minutes' => 'دقائق',
|
|
'hours' => 'ساعات',
|
|
'days' => 'أيام',
|
|
'weeks' => 'أسابيع',
|
|
'months' => 'أشهر',
|
|
],
|
|
'minutes_interval' => 'الدقائق بين عمليات التشغيل',
|
|
'hours_interval' => 'الساعات بين عمليات التشغيل',
|
|
'days_interval' => 'الأيام بين عمليات التشغيل',
|
|
'hour' => 'التشغيل عند الساعة',
|
|
'minute' => 'التشغيل عند الدقيقة',
|
|
'weekdays' => 'التشغيل في أيام الأسبوع',
|
|
'day_of_month' => 'يوم من الشهر',
|
|
'weekday_names' => [
|
|
'sun' => 'أحد',
|
|
'mon' => 'اثنين',
|
|
'tue' => 'ثلاثاء',
|
|
'wed' => 'أربعاء',
|
|
'thu' => 'خميس',
|
|
'fri' => 'جمعة',
|
|
'sat' => 'سبت',
|
|
],
|
|
'summary' => [
|
|
'every_n_minutes' => '{1}يعمل كل دقيقة|{2}يعمل كل دقيقتين|[3,10]يعمل كل :count دقائق|[11,*]يعمل كل :count دقيقة',
|
|
'every_n_hours' => '{1}يعمل كل ساعة عند الدقيقة :minute|{2}يعمل كل ساعتين عند الدقيقة :minute|[3,10]يعمل كل :count ساعات عند الدقيقة :minute|[11,*]يعمل كل :count ساعة عند الدقيقة :minute',
|
|
'every_n_days' => '{1}يعمل كل يوم عند :time|{2}يعمل كل يومين عند :time|[3,10]يعمل كل :count أيام عند :time|[11,*]يعمل كل :count يوم عند :time',
|
|
'weekly' => 'يعمل كل :days عند :time',
|
|
'monthly' => 'يعمل في اليوم :day من كل شهر عند :time',
|
|
],
|
|
],
|
|
],
|
|
'generate' => [
|
|
'social_accounts' => 'الحسابات الاجتماعية',
|
|
'social_accounts_empty' => 'لا توجد حسابات اجتماعية متصلة. اربط واحدًا أولًا.',
|
|
'target_slide_count' => 'الشرائح المراد إنشاؤها',
|
|
'prompt_template' => 'قالب الموجّه',
|
|
'prompt_template_hint' => 'اكتب {{ لإدراج بيانات من الخطوات السابقة.',
|
|
'image_count' => 'الصور المراد إنشاؤها',
|
|
'image_count_hint' => '0 = منشور نصي فقط (بلا صورة). 1 = صورة واحدة. 2 أو أكثر = عرض دائري.',
|
|
'use_brand_voice' => 'استخدام صوت العلامة التجارية',
|
|
'use_brand_voice_hint' => 'طبّق وصف علامتك التجارية وصوتها. أوقفه للتنسيق الأمين لمصادر الجهات الخارجية (الأخبار، RSS).',
|
|
'use_brand_visuals' => 'استخدام العناصر المرئية للعلامة التجارية',
|
|
'use_brand_visuals_hint' => 'وجّه صور الذكاء الاصطناعي بألوان علامتك التجارية وهويتها. أوقفه للصور المحايدة المدفوعة بموضوع المنشور فقط.',
|
|
'style' => 'النمط',
|
|
'account_summary' => '{1}حساب واحد · :format|{2}حسابان · :format|[3,10]:count حسابات · :format|[11,*]:count حساب · :format',
|
|
'formats' => [
|
|
'single' => 'مفرد',
|
|
'carousel' => 'عرض دائري',
|
|
],
|
|
],
|
|
'delay' => [
|
|
'duration' => 'المدة',
|
|
'unit' => 'الوحدة',
|
|
'units' => [
|
|
'minutes' => 'دقائق',
|
|
'hours' => 'ساعات',
|
|
'days' => 'أيام',
|
|
],
|
|
],
|
|
'condition' => [
|
|
'field' => 'الحقل',
|
|
'operator' => 'العامل',
|
|
'operators' => [
|
|
'contains' => 'يحتوي على',
|
|
'not_contains' => 'لا يحتوي على',
|
|
'equals' => 'يساوي',
|
|
'not_equals' => 'لا يساوي',
|
|
'matches' => 'يطابق (تعبير نمطي)',
|
|
'greater_than' => 'أكبر من',
|
|
'less_than' => 'أصغر من',
|
|
],
|
|
'value' => 'القيمة',
|
|
],
|
|
'publish' => [
|
|
'mode' => 'الوضع',
|
|
'modes' => [
|
|
'now' => 'نشر الآن',
|
|
'scheduled' => 'جدولة',
|
|
'draft' => 'حفظ كمسودة',
|
|
],
|
|
'scheduled_offset' => 'الإزاحة عن المُشغّل (بالدقائق)',
|
|
'offset_summary' => ':mode · +:offset د',
|
|
],
|
|
'end' => [
|
|
'reason' => 'السبب (اختياري)',
|
|
'reason_placeholder' => 'مثال: تمت تصفيته بواسطة شرط',
|
|
],
|
|
'fetch_rss' => [
|
|
'feed_url' => 'رابط الخلاصة',
|
|
'feed_url_hint' => 'في التشغيل الأول، تُضبط العلامة على "الآن" حتى لا تُغرِق العناصر التاريخية العقد اللاحقة. تشاهد عمليات التشغيل اللاحقة فقط العناصر الأحدث من الاستطلاع السابق.',
|
|
'inspect' => 'فحص الخلاصة',
|
|
'inspecting' => 'جارٍ الفحص…',
|
|
'inspect_hint' => 'اجلب عينة لاكتشاف الحقول المتاحة للاستخدام في العقد اللاحقة.',
|
|
'inspect_error' => 'تعذرت قراءة هذه الخلاصة. تحقق من الرابط وحاول مرة أخرى.',
|
|
'discovered_fields' => 'الحقول المتاحة',
|
|
'discovered_empty' => 'لم يتم العثور على حقول في أحدث عنصر.',
|
|
],
|
|
'http_request' => [
|
|
'url' => 'الرابط',
|
|
'method' => 'الطريقة',
|
|
'auth_type' => 'المصادقة',
|
|
'auth' => [
|
|
'none' => 'بلا (عام)',
|
|
'bearer' => 'رمز Bearer',
|
|
'basic' => 'مصادقة أساسية',
|
|
'api_key' => 'ترويسة مفتاح API',
|
|
],
|
|
'bearer_token' => 'رمز Bearer',
|
|
'basic_username' => 'اسم المستخدم',
|
|
'basic_password' => 'كلمة المرور',
|
|
'api_key_header' => 'اسم الترويسة',
|
|
'api_key_value' => 'مفتاح API',
|
|
'body_template' => 'قالب النص (JSON)',
|
|
'headers' => 'الترويسات',
|
|
'header_name' => 'اسم الترويسة',
|
|
'header_value' => 'القيمة',
|
|
'add_header' => 'إضافة ترويسة',
|
|
'polling_section' => 'القائمة وإزالة التكرار (اختياري)',
|
|
'polling_hint' => 'عندما تكون الاستجابة قائمة، يشغّل كل عنصر سير العمل بشكل منفصل. يشغّل الكائن الواحد مرة واحدة.',
|
|
'items_path' => 'مسار العناصر',
|
|
'items_path_hint' => 'اتركه فارغًا إذا كانت الاستجابة مصفوفة بالفعل. استخدم مسارًا منقّطًا (مثل data.items) لمصفوفة متداخلة، أو * لكائن مفهرس بالمعرّف.',
|
|
'item_key_path' => 'مسار مفتاح العنصر',
|
|
'item_key_path_hint' => 'مسار JSON لمعرّف فريد (مثل id). تُتخطى العناصر التي سبقت رؤيتها، لذا تظل الخلاصة بلا تواريخ تُمرّر الإدخالات الجديدة فقط.',
|
|
'item_date_path' => 'مسار تاريخ العنصر',
|
|
'item_date_path_hint' => 'مسار JSON للطابع الزمني للعنصر (مثل published_at). يُفضَّل على مسار المفتاح عند توفره. يسجّل الاستطلاع الأول الأساس ولا يمرّر شيئًا، لذا لا تُغرِق الخلاصة الموجودة في اليوم الأول.',
|
|
],
|
|
],
|
|
|
|
'delete' => [
|
|
'title' => 'حذف الأتمتة',
|
|
'description' => 'هل أنت متأكد من رغبتك في حذف هذه الأتمتة؟ ستتم إزالة جميع عمليات التشغيل وعناصر التشغيل أيضًا. لا يمكن التراجع عن هذا الإجراء.',
|
|
'confirm' => 'حذف',
|
|
'cancel' => 'إلغاء',
|
|
],
|
|
|
|
'flash' => [
|
|
'deleted' => 'تم حذف الأتمتة بنجاح!',
|
|
],
|
|
|
|
'errors' => [
|
|
'no_active_social_accounts' => 'لا توجد حسابات اجتماعية نشطة مُهيّأة لهذه الأتمتة.',
|
|
'must_have_one_trigger' => 'يجب أن تحتوي الأتمتة على عقدة مُشغّل واحدة بالضبط.',
|
|
'trigger_must_be_connected' => 'يجب أن تكون عقدة المُشغّل متصلة بعقدة واحدة على الأقل.',
|
|
'graph_contains_cycle' => 'يحتوي مخطط الأتمتة على حلقة.',
|
|
'only_failed_can_retry' => 'يمكن إعادة محاولة عمليات التشغيل الفاشلة فقط.',
|
|
'no_generated_post' => 'لم يتم العثور على منشور مُنشأ في التشغيل.',
|
|
'url_not_allowed' => 'رابط الطلب يشير إلى عنوان خاص أو غير قابل للوصول وتم حظره.',
|
|
'node_no_longer_exists' => 'العقدة :node_id لم تعد موجودة في الأتمتة.',
|
|
'no_trigger_connection' => 'لا توجد عقدة متصلة بعقدة المُشغّل.',
|
|
'fetch_rss_missing_url' => 'عقدة جلب RSS تفتقد إلى رابط خلاصة.',
|
|
'fetch_rss_request_failed' => 'فشل طلب خلاصة RSS.',
|
|
'fetch_rss_malformed' => 'خلاصة RSS مشوّهة.',
|
|
'http_missing_url' => 'عقدة طلب HTTP تفتقد إلى رابط.',
|
|
'http_request_exception' => 'أطلق طلب HTTP استثناءً.',
|
|
'http_request_failed' => 'فشل طلب HTTP.',
|
|
'http_items_path_not_array' => 'لم يُفضِ مسار العناصر إلى قائمة.',
|
|
'generate_image_format_required' => 'توليد الذكاء الاصطناعي ينشئ صورًا فقط. اختر تنسيق صورة (وليس فيديو).',
|
|
],
|
|
];
|