trypost/lang/ar/posts.php

671 lines
38 KiB
PHP
Raw Permalink Normal View History

<?php
return [
'title' => 'المنشورات',
'search' => 'البحث في المنشورات...',
'all_posts' => 'جميع المنشورات',
'new_post' => 'منشور جديد',
'no_posts' => 'لم يتم العثور على منشورات',
'no_search_results' => 'لا توجد منشورات مطابقة لبحثك',
'try_different_search' => 'جرّب كلمة مختلفة أو امسح البحث.',
'start_creating' => 'ابدأ بإنشاء أول منشور لك.',
'filter_by_label' => 'التصفية حسب التسمية',
'label_search_placeholder' => 'البحث في التسميات...',
'no_labels' => 'لم يتم العثور على تسميات.',
'clear_label_filter' => 'مسح تصفية التسميات',
'table' => [
'post' => 'المنشور',
'status' => 'الحالة',
'content' => 'المحتوى',
'platforms' => 'المنصات',
'labels' => 'التسميات',
'scheduled_at' => 'التاريخ',
'actions' => '',
],
'manage_posts' => 'إدارة جميع منشوراتك',
'delete_confirm' => 'هل أنت متأكد من رغبتك في حذف هذا المنشور؟',
'by' => 'بواسطة',
'actions' => [
'view' => 'عرض المنشور',
'delete' => 'حذف',
'duplicate' => 'تكرار',
'copy_id' => 'نسخ المعرّف',
'copied' => 'تم نسخ المعرّف إلى الحافظة',
],
'form' => [
'post_type' => 'نوع المنشور',
'board' => 'اللوحة',
'select_board' => 'اختر لوحة',
'search_board' => 'البحث عن لوحة...',
'no_board_found' => 'لم يتم العثور على لوحة',
'media' => 'الوسائط',
'min' => 'الحد الأدنى',
'uploading' => 'جارٍ الرفع...',
'drop_to_upload' => 'أفلِت للرفع',
'drag_and_drop' => 'اسحب وأفلِت أو انقر للرفع',
'photos_and_videos' => 'الصور ومقاطع الفيديو',
'photos_only' => 'الصور فقط',
'videos_only' => 'مقاطع الفيديو فقط',
'drag_to_reorder' => 'اسحب لإعادة الترتيب',
'caption' => 'التسمية التوضيحية',
'write_caption' => 'اكتب التسمية التوضيحية...',
'content_exceeds_platform' => ':platform: أطول بمقدار :over حرفًا (الحد الأقصى :limit).',
'tiktok' => [
'settings' => 'إعدادات TikTok',
'variant_label' => 'نوع المنشور',
'variant' => [
'video' => 'فيديو',
'photo' => 'عرض صور دائري',
],
'posting_to' => 'النشر إلى',
'privacy_level' => 'من يمكنه رؤية هذا الفيديو؟',
'privacy_placeholder' => 'اختر من يمكنه مشاهدة هذا المنشور',
'privacy' => [
'public' => 'عام للجميع',
'friends' => 'الأصدقاء المتابَعون بشكل متبادل',
'followers' => 'المتابِعون',
'private' => 'أنا فقط',
'private_disabled_branded' => 'لا يمكن ضبط ظهور المحتوى ذي العلامة التجارية على خاص.',
],
'privacy_hint' => 'تعتمد الخيارات المتاحة على إعدادات حسابك على TikTok.',
'auto_add_music' => 'إضافة موسيقى تلقائيًا',
'auto_add_music_hint' => 'تتوفر هذه الميزة للصور فقط. ستضيف موسيقى افتراضية يمكنك تغييرها لاحقًا.',
'yes' => 'نعم',
'no' => 'لا',
'allow_users' => 'السماح للمستخدمين بـ:',
'comments' => 'التعليق',
'duet' => 'الديو (Duet)',
'stitch' => 'الدمج (Stitch)',
'is_aigc' => 'فيديو مُنشأ بالذكاء الاصطناعي',
'disclose' => 'الإفصاح عن محتوى الفيديو',
'disclose_hint' => 'فعّله للإفصاح عن أن هذا الفيديو يروّج لسلع أو خدمات مقابل شيء ذي قيمة. قد يروّج الفيديو لك أو لطرف ثالث أو كليهما.',
'promotional_organic_title' => 'ستُصنَّف صورتك/فيديوك على أنها "محتوى ترويجي".',
'promotional_paid_title' => 'ستُصنَّف صورتك/فيديوك على أنها "شراكة مدفوعة".',
'promotional_description' => 'لا يمكن تغيير هذا بمجرد نشر الفيديو.',
'compliance_incomplete' => 'يجب أن تحدد ما إذا كان محتواك يروّج لك أو لطرف ثالث أو كليهما.',
'privacy_required' => 'مستوى الخصوصية على TikTok مطلوب عند النشر.',
'branded_cleared_private' => 'تم مسح الخصوصية لأن المحتوى ذا العلامة التجارية لا يمكن أن يكون خاصًا.',
'interaction_disabled_by_creator' => 'مُعطَّل في إعدادات حسابك على TikTok',
'max_duration_exceeded' => 'مدة الفيديو :duration ث لكن هذا الحساب يمكنه نشر مقاطع فيديو حتى :max ث فقط.',
'processing_hint' => 'بعد النشر، قد يستغرق معالجة المحتوى وظهوره على ملفك الشخصي في TikTok بضع دقائق.',
'brand_organic' => 'علامتك التجارية',
'brand_organic_hint' => 'أنت تروّج لنفسك أو لعلامتك التجارية الخاصة. سيُصنَّف هذا الفيديو على أنه محتوى عضوي للعلامة التجارية.',
'brand_content' => 'محتوى ذو علامة تجارية',
'brand_content_hint' => 'أنت تروّج لعلامة تجارية أخرى أو لطرف ثالث. سيُصنَّف هذا الفيديو على أنه محتوى ذو علامة تجارية.',
'compliance' => [
'agree' => 'بالنشر، فإنك توافق على',
'music_usage' => 'تأكيد استخدام الموسيقى',
'and' => 'و',
'branded_policy' => 'سياسة المحتوى ذي العلامة التجارية',
],
],
'instagram' => [
'settings' => 'إعدادات Instagram',
'posting_to' => 'النشر إلى',
'variant_label' => 'نوع المنشور',
'variant' => [
'feed' => 'منشور',
'reel' => 'ريل',
'story' => 'قصة',
],
'aspect_label' => 'نسبة العرض إلى الارتفاع',
'aspect' => [
'square' => 'مربع (1:1)',
'portrait' => 'عمودي (4:5)',
'landscape' => 'أفقي (16:9)',
'original' => 'الأصلي',
],
],
'facebook' => [
'settings' => 'إعدادات Facebook',
'posting_to' => 'النشر إلى',
'variant_label' => 'نوع المنشور',
'variant' => [
'post' => 'منشور',
'reel' => 'ريل',
'story' => 'قصة',
],
'aspect_label' => 'نسبة العرض إلى الارتفاع',
'aspect' => [
'square' => 'مربع (1:1)',
'portrait' => 'عمودي (4:5)',
'landscape' => 'أفقي (16:9)',
'original' => 'الأصلي',
],
],
'linkedin' => [
'settings' => 'إعدادات LinkedIn',
'settings_page' => 'إعدادات صفحة LinkedIn',
'posting_to' => 'النشر إلى',
'document_title' => 'عنوان المستند',
'document_title_placeholder' => 'يظهر على منشور مستند PDF الخاص بك',
],
'pinterest' => [
'settings' => 'إعدادات Pinterest',
'posting_to' => 'النشر إلى',
'variant_label' => 'نوع الدبوس',
'variant' => [
'pin' => 'دبوس',
'video_pin' => 'دبوس فيديو',
'carousel' => 'عرض دائري',
],
'board' => 'اللوحة',
'select_board' => 'اختر لوحة',
'no_boards' => 'لم يتم العثور على لوحات Pinterest. أنشئ واحدة في حسابك على Pinterest أولًا.',
'boards_truncated' => 'تعذر تحميل بعض اللوحات. إذا كانت لوحتك مفقودة، افتح Pinterest وحاول مرة أخرى.',
'search_board' => 'البحث في اللوحات...',
'no_board_found' => 'لا توجد لوحة مطابقة لبحثك.',
'board_required' => 'اختر لوحة Pinterest لنشر هذا المنشور.',
Add optional Pinterest pin title and destination link (#232) * Add optional Pinterest pin title, description, and link. Expose title/description/link across web, API, and MCP; seed description from caption into meta on save, and publish description only from meta. Co-authored-by: Cursor <cursoragent@cursor.com> * Expand Pinterest title/description/link test coverage. Cover web draft persistence and validation bounds, API/MCP update merge and seed, and publisher payload fields on video and carousel pins. Co-authored-by: Cursor <cursoragent@cursor.com> * Simplify Pinterest: description is post content again. Keep optional title and link in meta/settings only. Remove the separate description textarea, seed logic, and meta.description path so Pinterest follows the shared caption pattern. Co-authored-by: Cursor <cursoragent@cursor.com> * Refactor Pinterest meta handling and validation. - Update CreatePost and UpdatePost actions to filter out null values from meta fields. - Introduce a new method in PinterestPublisher to resolve board IDs, ensuring required fields are validated. - Enhance PinterestSettings component to manage title and link inputs, including validation for HTTP URLs. - Update PostPlatformMetaRules to enforce URL validation for Pinterest links. - Add tests for clearing Pinterest title and link, and for rejecting invalid links during scheduling. This refactor improves the handling of Pinterest metadata and enhances user experience by ensuring proper validation and error handling. * Add validation messages and attributes for Pinterest meta fields - Introduced custom validation messages and friendly attribute names for Pinterest link and title fields in PostPlatformMetaRules. - Updated StorePostRequest, UpdatePostRequest, and related tools to utilize these new messages and attributes. - Enhanced tests to assert correct error messages for invalid Pinterest links and title length constraints. This update improves user feedback during post creation and editing, ensuring clarity in validation errors. * Remove click.prevent directive from Pinterest link in PinterestPreview component. This change simplifies the link behavior, allowing default click actions to occur, which may enhance user interaction with the Pinterest link. * Update validation error messages for Pinterest meta fields in tests - Refined the assertions in PostApiPlatformMetaTest to include localized validation messages for Pinterest title and link fields. - Ensured that error messages reflect the updated validation rules, enhancing clarity for users during post creation and editing. --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-05 21:15:50 +00:00
'title' => 'العنوان',
'title_placeholder' => 'عنوان اختياري للدبوس',
'link' => 'رابط الوجهة',
'link_placeholder' => 'https://example.com',
'link_invalid' => 'أدخل رابط وجهة صالحًا (http أو https).',
'title_max' => 'يجب ألا يتجاوز العنوان 100 حرفًا.',
'link_max' => 'يجب ألا يتجاوز رابط الوجهة 2048 حرفًا.',
],
'discord' => [
'settings' => 'إعدادات Discord',
'posting_to' => 'النشر إلى',
'channel' => 'القناة',
'select_channel' => 'اختر قناة',
'loading_channels' => 'جارٍ تحميل القنوات…',
'search_channel' => 'البحث في القنوات…',
'no_channels' => 'لم يتم العثور على قنوات.',
'channel_required' => 'اختر قناة Discord لنشر هذا المنشور.',
'mentions' => 'الإشارات',
'search_mention' => 'أشِر إلى دور أو عضو…',
'embeds' => 'التضمينات',
'embed' => 'تضمين',
'add_embed' => 'إضافة تضمين',
'embed_title' => 'عنوان التضمين',
'embed_description' => 'وصف التضمين',
'embed_url' => 'رابط التضمين',
'embed_image' => 'رابط الصورة',
'embed_color' => 'اللون',
],
'warnings' => [
'no_variant' => 'اختر نوع منشور للمتابعة.',
'requires_media' => 'يتطلب هذا النوع من المنشورات صورة أو فيديو واحدًا على الأقل.',
'max_files_exceeded' => 'يقبل هذا النوع من المنشورات حتى :max ملف وسائط (لديك :current).',
'min_files_required' => 'يتطلب هذا النوع من المنشورات :min ملف وسائط على الأقل (لديك :current).',
'no_video_allowed' => 'لا يقبل هذا النوع من المنشورات مقاطع الفيديو.',
'no_image_allowed' => 'يقبل هذا النوع من المنشورات مقاطع الفيديو فقط.',
'no_document_allowed' => 'لا يقبل هذا النوع من المنشورات مستندات PDF.',
'no_mixed_media' => 'لا يمكن الجمع بين الصور والفيديو في نفس المنشور.',
'document_not_alone' => 'يجب نشر ملف PDF بمفرده، دون صور أو مقاطع فيديو أخرى.',
'gif_not_allowed' => 'لا تقبل هذه المنصة صور GIF. أزِل صورة GIF أو اختر شبكة مختلفة.',
'image_too_large' => 'تتجاوز الصورة حد :max لهذا النوع من المنشورات (حجم صورتك :current).',
'video_too_large' => 'يتجاوز الفيديو حد :max لهذا النوع من المنشورات (حجم فيديوك :current).',
'document_too_large' => 'يتجاوز ملف PDF حد :max لهذا النوع من المنشورات (حجم ملفك :current).',
'video_too_long' => 'مدة الفيديو :current، لكن هذا النوع من المنشورات يسمح حتى :max.',
'aspect_ratio_too_narrow' => 'نسبة العرض إلى الارتفاع :current طويلة جدًا لهذا النوع من المنشورات (الحد الأدنى :min).',
'aspect_ratio_too_wide' => 'نسبة العرض إلى الارتفاع :current عريضة جدًا لهذا النوع من المنشورات (الحد الأقصى :max).',
],
],
'status' => [
'pending' => 'قيد الانتظار',
'draft' => 'مسودة',
'scheduled' => 'مجدول',
'publishing' => 'قيد النشر',
'retrying' => 'إعادة المحاولة',
'published' => 'منشور',
'partially_published' => 'منشور جزئيًا',
'failed' => 'فشل',
],
'descriptions' => [
'draft' => 'منشورات تنتظر الجدولة',
'scheduled' => 'منشورات مجدولة للنشر',
'published' => 'منشورات تم نشرها بالفعل',
],
'ai' => [
'generate' => [
'button_tooltip' => 'الإنشاء بالذكاء الاصطناعي',
'title' => 'إنشاء منشور بالذكاء الاصطناعي',
'description' => 'صِف موضوع المنشور. سيستخدم الذكاء الاصطناعي سياق علامتك التجارية لكتابته.',
'prompt_label' => 'ما موضوع هذا المنشور؟',
'prompt_placeholder' => 'مثال: الإعلان عن ميزتنا الجديدة لإنشاء الصور للعروض الدائرية',
'preview_label' => 'معاينة',
'start' => 'إنشاء',
'apply' => 'استخدام هذا المحتوى',
'retry' => 'إعادة المحاولة',
'cancel' => 'إلغاء',
fix: subscribe to AI generation channel before dispatching the job (#269) * fix: subscribe to AI generation channel before dispatching the job AiGenerateDialog posted the generate request and only subscribed to the broadcast channel once the response came back. Reverb's plain Channel (vendor/laravel/reverb/.../Channels/Channel.php) delivers broadcasts by iterating the in-memory connection list at send time only — no history, no replay. If the queued job started streaming text_delta/stream_end events before the private-channel subscribe handshake finished, those events were gone for good and the dialog hung on 'streaming' forever. Generate the generation_id client-side, await channel subscription confirmation (Echo's channel.subscribed(), backed by pusher:subscription_succeeded) before sending the generate request, and have the backend use the client-supplied id instead of minting its own. Related to #218. * fix: handle subscribe failure, dialog-close race, and i18n hardcoded strings Code review on the previous commit surfaced real gaps: - useAiStream only handled the subscribe-success path (.subscribed()). A definitive pusher:subscription_error (expired session, CSRF mismatch) fell through to the 5s timeout and was treated as success, reproducing the exact #218 hang via a different trigger. subscribe() now returns a boolean: true on confirm-or-ambiguous-timeout (proceed optimistically), false only on an explicit error (don't dispatch work nothing will ever hear). - AiGenerateDialog now bails without dispatching if the dialog is closed while awaiting subscription confirmation (up to 5s), and unsubscribes on a post-subscribe dispatch failure so stale listeners can't flip status to 'completed' after an error was already shown. - Extracted aiGenerationChannel() so the frontend has one place to update if the channel format changes, and cross-referenced the two remaining backend copies (PostAiGenerateController, StreamPostContent). - Replaced the two hardcoded English fallback error strings with i18n keys (posts.ai.generate.errors.*) across all 16 locales — this app only ships translated copy. - Simplified subscribe(): dropped a redundant "already settled" guard and the clearTimeout bookkeeping — Promise.resolve() already no-ops after the first call, so there was nothing to guard. * fix: subscribe before dispatch in AI post creation and image regeneration flows Extracts subscribePrivateChannel as a shared helper and applies the same subscribe-before-dispatch fix from the post edit flow (issue #218) to the other two flows that stream over private channels. Post creation wizard moves the StreamPostCreation dispatch out of AiPostWizard.vue and into Loading.vue, so the channel is subscribed before the job that broadcasts on it is dispatched — previously a full page navigation happened between dispatch and subscribe with no timeout fallback, so a lost event hung the page forever. * refactor: trim explanatory comments added in the subscribe-before-dispatch fix Rationale lives in the commit history, not scattered inline comments. * refactor: trim remaining explanatory comments from the subscribe-before-dispatch fix Same cleanup as the previous commit, applied to the files from the original post-edit-flow fix. * fix: dedup post-creation dispatch, surface field-level AI errors, harden edge cases Uses ShouldBeUnique on StreamPostCreation (scoped per-user) instead of an ad-hoc cache guard, matching the pattern already used by PublishToSocialPlatform and VerifyUpcomingPostConnections. Field-level validation errors (prompt/instruction) now render inline via InputError, matching how every other form in the app surfaces them, instead of a generic status banner. Also fixes a 422 response missing the `errors` key that Inertia's client silently swallows, adds error handling around the wizard's navigation to the loading page, and extracts the duplicated error-message parsing into a shared helper.
2026-08-10 19:06:37 +00:00
'errors' => [
'start_failed' => 'تعذّر بدء الإنشاء.',
'generation_failed' => 'فشل الإنشاء بالذكاء الاصطناعي.',
],
],
'review' => [
'button_tooltip' => 'المراجعة بالذكاء الاصطناعي',
'title' => 'مراجعة المنشور بالذكاء الاصطناعي',
'description' => 'يفحص الذكاء الاصطناعي القواعد والإملاء والوضوح. طبّق الاقتراحات التي توافق عليها.',
'loading' => 'جارٍ مراجعة نصك...',
'no_issues' => 'لم يتم العثور على مشكلات. يبدو جيدًا.',
'original' => 'الأصل',
'suggestion' => 'اقتراح',
'apply' => 'تطبيق',
'apply_all' => 'تطبيق الكل',
'applied' => 'تم التطبيق',
'cancel' => 'إلغاء',
],
'image_regenerate' => [
'button' => 'تعديل',
'title' => 'تعديل صورة الذكاء الاصطناعي',
'description' => 'صِف التصحيح. تحل الصورة الجديدة محل الحالية وتحتفظ بموضعها في العرض الدائري.',
'instruction_label' => 'التعليمات',
'instruction_placeholder' => 'مثال: صحّح الخطأ المطبعي في العنوان واجعل الخلفية أفتح.',
'processing' => 'جارٍ إعادة إنشاء الصورة... قد يستغرق هذا بضع ثوانٍ.',
'submit' => 'إعادة إنشاء الصورة',
'cancel' => 'إلغاء',
'success' => 'تم تحديث الصورة. حلّت النسخة الجديدة محل السابقة في منشورك.',
'fallback_title' => 'تحسين نص هذه الصورة',
'errors' => [
'required' => 'التعليمات مطلوبة.',
'start_failed' => 'فشل بدء إعادة الإنشاء.',
'unavailable' => 'تعذر إعادة إنشاء هذه الصورة الآن.',
'timeout' => 'تستغرق إعادة الإنشاء وقتًا أطول من المتوقع. حاول مرة أخرى بعد لحظة.',
'media_not_found' => 'لم يتم العثور على عنصر الوسائط.',
'not_ai_media' => 'يمكن إعادة إنشاء الوسائط المُنشأة بالذكاء الاصطناعي فقط.',
],
],
'templates' => [
'image_card' => [
'name' => 'منشور صورة',
'description' => 'صورة بالذكاء الاصطناعي مع عنوان وتسمية توضيحية.',
],
'carousel' => [
'name' => 'عرض دائري',
'description' => 'عرض دائري متعدد الشرائح مع تسمية توضيحية.',
],
'tweet_card' => [
'name' => 'بطاقة تغريدة',
'description' => 'منشورك بتنسيق منشور X/Twitter.',
],
'tweet_card_image' => [
'name' => 'بطاقة تغريدة مع صورة',
'description' => 'منشورك كبطاقة X/Twitter فوق صورة ضبابية.',
],
],
],
'show' => [
'title' => 'تفاصيل المنشور',
'edit' => 'تعديل',
'back' => 'رجوع',
'no_content' => 'لا توجد تسمية توضيحية',
'platforms' => 'المنصات',
'no_platforms' => 'لم يتم اختيار أي منصات.',
'view_on_platform' => 'العرض على المنصة',
'published_on' => 'نُشر في :date',
'scheduled_for' => 'مجدول لـ :date',
'draft' => 'مسودة',
'status_pending' => 'قيد الانتظار',
'metrics' => 'المقاييس',
'metrics_loading' => 'جارٍ تحميل المقاييس…',
'metrics_unavailable' => 'المقاييس غير متاحة لهذه المنصة بعد.',
'metrics_empty' => 'لم تُرجَع أي مقاييس.',
],
'edit' => [
'title' => 'تعديل المنشور',
'view_title' => 'عرض المنشور',
'labels' => 'التسميات',
'no_labels' => 'لم يتم إنشاء تسميات بعد',
'schedule' => 'جدولة',
'pick_time' => 'اختر الوقت',
'pick_time_past' => 'اختر تاريخًا ووقتًا مستقبليًا.',
'post_now' => 'انشر الآن',
'time' => 'الوقت',
'cancel' => 'إلغاء',
'delete' => 'حذف',
'schedule_for' => 'جدولة لـ',
'schedule_date' => 'تاريخ الجدولة',
'unschedule' => 'إلغاء الجدولة',
'saving' => 'جارٍ الحفظ...',
'saved' => 'تم الحفظ',
'draft' => 'مسودة',
'media' => 'الوسائط',
'add_media' => 'إضافة وسائط',
'caption' => 'التسمية التوضيحية',
'caption_placeholder' => 'اكتب التسمية التوضيحية...',
'compose_title' => 'إنشاء منشور',
'compose_subtitle' => 'اكتب رسالتك وأضِف الوسائط',
'preview_empty' => [
'title' => 'لم يتم اختيار منصة',
'description' => 'اختر منصة للنشر لرؤية المعاينة.',
],
'drop_zone_title' => 'إضافة وسائط',
'drop_zone_subtitle' => 'اسحب الملفات وأفلتها أو انقر للتصفح',
'add' => 'إضافة',
'publish_to' => 'النشر إلى',
'organize' => 'تنظيم',
'signatures' => 'التوقيعات',
'view_on_platform' => 'العرض على المنصة',
'platform_status' => 'حالة المنصة',
'compliance_incomplete' => 'بعض إعدادات المنصة غير مكتملة أو غير متوافقة مع الوسائط المرفقة.',
'compliance' => [
'requires_content_or_media' => 'أضِف نصًا أو وسائط للنشر.',
'requires_media' => 'أضِف صورة أو فيديو للنشر هنا.',
'too_many_files' => 'مسموح بـ :max ملف فقط لهذا التنسيق.',
'too_few_files' => 'أضِف :min ملف على الأقل لهذا التنسيق.',
'no_videos' => 'يُسمح بالصور فقط لهذا التنسيق.',
'no_images' => 'يُسمح بمقاطع الفيديو فقط لهذا التنسيق.',
'no_mixed_media' => 'لا يمكن الجمع بين الصور ومقاطع الفيديو في نفس المنشور.',
'no_gifs' => 'صور GIF غير مدعومة هنا.',
'no_documents' => 'مستندات PDF غير مدعومة في هذا التنسيق.',
'document_not_alone' => 'يجب نشر ملف PDF بمفرده، دون صور أو مقاطع فيديو أخرى.',
'video_too_large' => 'يتجاوز الفيديو حد الحجم لهذه المنصة.',
'video_too_long' => 'يجب أن تكون مدة الفيديو أقل من :seconds ثانية لهذا التنسيق.',
'image_too_large' => 'تتجاوز الصورة حد الحجم لهذه المنصة.',
'document_too_large' => 'يتجاوز ملف PDF حد الحجم لهذه المنصة.',
'aspect_ratio_invalid' => 'نسبة العرض إلى الارتفاع غير مدعومة في هذا التنسيق.',
'no_content_type' => 'اختر نوع محتوى لهذه المنصة.',
'requires_text' => 'أضِف نصًا — يتطلب هذا التنسيق عنوانًا.',
],
'publishing' => 'جارٍ النشر...',
'publishing_overlay_title' => 'جارٍ نشر منشورك',
'publishing_overlay_subtitle' => 'قد يستغرق هذا بضع لحظات. يمكنك مغادرة هذه الصفحة بأمان.',
'scheduled_overlay_title' => 'هذا المنشور مجدول',
'scheduled_overlay_subtitle' => 'مجدول لـ :date. ألغِ جدولته أولًا لإجراء تغييرات.',
'unschedule_cta' => 'ألغِ الجدولة للتعديل',
'tabs' => [
'compose' => 'الكتابة',
'preview' => 'معاينة',
'channels' => 'القنوات',
'comments' => 'التعليقات',
'comments_empty' => 'لا توجد تعليقات بعد.',
],
'media_picker' => [
'title' => 'اختر من المعرض',
'search' => 'البحث في الوسائط...',
'empty' => 'لا توجد وسائط في معرضك بعد',
'cancel' => 'إلغاء',
'add' => 'إضافة',
'add_count' => 'إضافة :count',
],
'alt_text' => [
'label' => 'نص بديل',
'edit' => 'تحرير النص البديل',
'placeholder' => 'صف هذه الصورة للأشخاص الذين يستخدمون برامج قراءة الشاشة',
'hint' => 'يُنشر على المنصات التي تدعم أوصاف الصور.',
'save' => 'حفظ',
],
'emoji_picker' => [
'search' => 'البحث عن رمز تعبيري',
'empty' => 'لم يتم العثور على رموز تعبيرية',
'recent' => 'المستخدمة كثيرًا',
'smileys' => 'الوجوه والمشاعر',
'people' => 'الأشخاص والجسم',
'nature' => 'الحيوانات والطبيعة',
'food' => 'الطعام والشراب',
'activities' => 'الأنشطة',
'travel' => 'السفر والأماكن',
'objects' => 'الأشياء',
'symbols' => 'الرموز',
'flags' => 'الأعلام',
],
'status' => [
'pending' => 'قيد الانتظار',
'scheduled' => 'مجدول',
'published' => 'منشور',
'publishing' => 'جارٍ النشر...',
'retrying' => 'جارٍ إعادة المحاولة...',
'failed' => 'فشل',
],
'delete_modal' => [
'title' => 'حذف المنشور',
'description' => 'هل أنت متأكد من رغبتك في حذف هذا المنشور؟ لا يمكن التراجع عن هذا الإجراء.',
'action' => 'حذف',
'cancel' => 'إلغاء',
],
'sync_enable' => [
'title' => 'تفعيل المزامنة؟',
'description' => 'ستشترك جميع المنصات في نفس المحتوى. سيتم استبدال أي تعديلات مخصصة أُجريت على منصات فردية بالمحتوى الحالي.',
'cancel' => 'إلغاء',
'action' => 'تفعيل المزامنة',
],
'sync_disable' => [
'title' => 'تعطيل المزامنة؟',
'description' => 'ستحتفظ كل منصة بمحتواها الحالي، لكن التعديلات المستقبلية ستُطبَّق فقط على المنصة التي تعدّلها.',
'customize_note' => 'ستتمكن من تخصيص المحتوى لكل منصة على حدة.',
'cancel' => 'إلغاء',
'action' => 'تعطيل المزامنة',
],
'platforms_dialog' => [
'title' => 'اختيار المنصات',
'description' => 'اختر المنصات التي تريد نشر هذا المنشور عليها.',
],
'signatures_modal' => [
'search' => 'البحث في التوقيعات...',
'no_results' => 'لم يتم العثور على توقيعات.',
],
'validation' => [
'select_board' => 'اختر لوحة',
'images_not_supported' => 'الصور غير مدعومة',
'videos_not_supported' => 'مقاطع الفيديو غير مدعومة',
'max_images' => 'الحد الأقصى :count صور',
'requires_media' => 'يتطلب وسائط',
'requires_content' => 'المحتوى النصي مطلوب',
'exceeded' => 'تجاوز :count',
'does_not_support_images' => 'لا يدعم :platform الصور',
'supports_up_to_images' => 'يدعم :platform حتى :count صور',
'does_not_support_videos' => 'لا يدعم :platform مقاطع الفيديو',
],
],
'content_types' => [
'instagram_feed' => [
'label' => 'منشور',
'description' => 'يظهر في خلاصتك وملفك الشخصي',
],
'instagram_reel' => [
'label' => 'ريل',
'description' => 'فيديو قصير حتى 15 دقيقة',
],
'instagram_story' => [
'label' => 'قصة',
'description' => 'يختفي بعد 24 ساعة',
],
'linkedin_post' => [
'label' => 'منشور',
'description' => 'منشور قياسي — صورة واحدة أو متعددة أو فيديو أو PDF',
],
'linkedin_page_post' => [
'label' => 'منشور',
'description' => 'منشور قياسي — صورة واحدة أو متعددة أو فيديو أو PDF',
],
'facebook_post' => [
'label' => 'منشور',
'description' => 'منشور قياسي على صفحتك',
],
'facebook_reel' => [
'label' => 'ريل',
'description' => 'فيديو قصير حتى 90 ثانية',
],
'facebook_story' => [
'label' => 'قصة',
'description' => 'قصة فيديو عمودية، حتى 60 ثانية',
],
'tiktok_video' => [
'label' => 'فيديو',
'description' => 'محتوى فيديو قصير',
],
'tiktok_photo' => [
'label' => 'عرض صور دائري',
'description' => 'حتى 35 صورة كعرض دائري قابل للتمرير',
],
'youtube_short' => [
'label' => 'مقطع قصير',
'description' => 'فيديو عمودي حتى 3 دقائق',
],
'x_post' => [
'label' => 'منشور',
'description' => 'تغريدة بنص ووسائط',
],
'threads_post' => [
'label' => 'منشور',
'description' => 'منشور نصي مع وسائط اختيارية',
],
'pinterest_pin' => [
'label' => 'دبوس',
'description' => 'دبوس صورة قياسي',
],
'pinterest_video_pin' => [
'label' => 'دبوس فيديو',
'description' => 'دبوس فيديو (4 ث - 15 د)',
],
'pinterest_carousel' => [
'label' => 'عرض دائري',
'description' => 'عرض دائري متعدد الصور (2-5 صور)',
],
'bluesky_post' => [
'label' => 'منشور',
'description' => 'منشور نصي مع صور اختيارية',
],
'mastodon_post' => [
'label' => 'منشور',
'description' => 'منشور نصي مع وسائط اختيارية',
],
'telegram_post' => [
'label' => 'منشور',
'description' => 'منشور نصي مع وسائط اختيارية',
],
'discord_message' => [
'label' => 'رسالة',
'description' => 'رسالة إلى قناة Discord مع وسائط وتضمينات اختيارية',
],
],
'platforms' => [
'linkedin' => 'LinkedIn',
'linkedin-page' => 'LinkedIn Page',
'x' => 'X',
'tiktok' => 'TikTok',
'youtube' => 'YouTube Shorts',
'facebook' => 'Facebook Page',
'instagram' => 'Instagram',
'threads' => 'Threads',
'pinterest' => 'Pinterest',
'bluesky' => 'Bluesky',
'mastodon' => 'Mastodon',
],
'flash' => [
'scheduled' => 'تمت جدولة المنشور بنجاح!',
'deleted' => 'تم حذف المنشور بنجاح!',
'duplicated' => 'تم تكرار المنشور كمسودة.',
'cannot_edit_finalized' => 'تمت معالجة هذا المنشور بالفعل ولا يمكن إعادة نشره. كرّره للمحاولة مرة أخرى.',
'cannot_delete_published' => 'لا يمكن حذف المنشورات المنشورة.',
'connect_first' => 'اربط شبكة اجتماعية واحدة على الأقل قبل إنشاء منشور.',
],
'errors' => [
'account_disconnected' => 'الحساب الاجتماعي مفصول',
'account_inactive' => 'الحساب الاجتماعي مُعطَّل',
'account_token_expired' => 'انتهت جلسة الحساب الاجتماعي — يرجى إعادة الربط',
fix: Pinterest video processing timeout — longer poll + retry (#246) * fix: give Pinterest video processing more time and retry on timeout A valid ~54s video pin failed after ~90s of polling while Pinterest was still processing. Extend the poll window to ~5 minutes and treat timeout as platform unavailable so PublishToSocialPlatform reschedules instead of failing the post on the first attempt. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: use Laravel Sleep for Pinterest media processing polls Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: inline Pinterest video processing poll constants Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: map Pinterest media upload statuses to an enum Use the official MediaUploadStatus values (registered, processing, succeeded, failed) instead of comparing raw strings in the publisher. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: trim Pinterest media processing docblock * fix: cap platform-unavailable retries and recover stuck retrying posts Stop infinite reschedules after 6 attempts with a user-safe failure message, keep technical detail in error_context, recover Retrying platforms in social:recover-stuck-posts, and drop unused isTerminal(). Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: remove unused failedCount in RecoverStuckPosts Co-authored-by: Cursor <cursoragent@cursor.com> * fix: skip final Pinterest poll sleep and localize recover timeout Co-authored-by: Cursor <cursoragent@cursor.com> * fix: raise publish job timeout headroom and ignore already-failed platforms Give social publish jobs 15 minutes so Pinterest media polling fits under the worker limit, bump Horizon/redis retry_after above that timeout, and skip handle/failed when the platform is already Failed so delayed jobs cannot revive posts recovered by social:recover-stuck-posts. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: restore social-publishing and ai-assistant horizon supervisors Co-authored-by: Cursor <cursoragent@cursor.com> * fix: harden Pinterest 401 handling, unique publish jobs, and recover JSON Treat media-status 401 as TokenExpired, make PublishToSocialPlatform unique per platform+attempt so retries still queue, and persist recover error_context via Eloquent casts instead of manual json_encode. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: mass-update stuck post platforms without per-row each Eloquent query updates already bind JSON arrays correctly here, so one UPDATE is enough — no manual json_encode and no N model writes. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: simplify Pinterest media processing poll loop Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: simplify publish job retry and terminal status checks Co-authored-by: Cursor <cursoragent@cursor.com> * fix: do not finalize posts while platforms are still retrying Co-authored-by: Cursor <cursoragent@cursor.com> * test: cover Pinterest timeout, unique jobs, and recover edge cases Co-authored-by: Cursor <cursoragent@cursor.com> * fix: retry Pinterest media poll on connection errors and tighten tests Co-authored-by: Cursor <cursoragent@cursor.com> * fix: remove ineffective TypeError import that breaks CI Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 23:49:37 +00:00
'platform_unavailable' => 'المنصة غير متاحة مؤقتًا. سنعيد المحاولة قريبًا.',
'platform_unavailable_exhausted' => 'ظلت المنصة غير متاحة بعد عدة محاولات. يرجى المحاولة لاحقًا.',
'publishing_timed_out' => 'انتهت مهلة النشر. يرجى المحاولة مرة أخرى.',
],
'delete' => [
'title' => 'حذف المنشور؟',
'description' => 'لا يمكن التراجع عن هذا الإجراء. ستتم إزالة المنشور وجميع وسائطه نهائيًا.',
'confirm' => 'نعم، احذف',
'cancel' => 'إلغاء',
],
'create' => [
'title' => 'إنشاء منشور جديد',
'description' => 'اختر كيف تريد البدء.',
'scratch_title' => 'البدء من الصفر',
'scratch_description' => 'افتح منشورًا فارغًا واكتب كل شيء بنفسك.',
'ai_title' => 'الإنشاء بالذكاء الاصطناعي',
'ai_description' => 'صِف ما تريده وينشئ الذكاء الاصطناعي المحتوى من أجلك.',
'ai_configure_description' => 'اختر تنسيقًا وصِف المنشور الذي تريد إنشاءه.',
'ai_pick_template_description' => 'اختر نمطًا لمنشورك المُنشأ بالذكاء الاصطناعي.',
'coming_soon' => 'قريبًا',
'preview' => [
'image_title' => 'عنوان الصورة',
'image_body' => 'نص الصورة',
],
'steps' => [
'template_picker_title' => 'اختر نمطًا',
'format_title' => 'اختر تنسيقًا',
'format_description' => 'اختر نوع المنشور الذي تريد إنشاءه.',
'account_title' => 'اختر حسابًا',
'account_description' => 'اختر الحساب الاجتماعي للنشر إليه.',
'media_title' => 'خيارات الوسائط',
'media_carousel' => 'كم عدد الشرائح؟',
'media_optional' => 'تضمين صور؟',
'media_optional_label' => 'كم عدد الصور؟',
'media_none' => 'بلا',
'media_count_label' => 'عدد الصور',
'brand_colors_label' => 'ألوان العلامة التجارية',
'brand_colors_description' => 'طبّق لوحة ألوان علامتك التجارية على الصور المُنشأة. عطّله لترك الذكاء الاصطناعي يختار الألوان التي تناسب المحتوى.',
'prompt_title' => 'صِف منشورك',
'prompt_label' => 'ما موضوع هذا المنشور؟',
'prompt_placeholder' => 'مثال: الإعلان عن ميزة العرض الدائري الجديدة لدينا على Instagram',
'preview_error' => 'حدث خطأ ما. يرجى المحاولة مرة أخرى.',
'loading_page_title' => 'جارٍ إنشاء منشورك',
'loading_eta' => 'الوقت المقدّر: حوالي :minutes.',
'loading_eta_minute_one' => 'دقيقة واحدة',
'loading_eta_minute_other' => ':count دقيقة',
'loading_leave_title' => 'يمكنك متابعة عملك.',
'loading_leave_body' => 'سنُعلمك عندما يصبح المنشور جاهزًا.',
'loading_leave_cta' => 'الذهاب إلى التقويم',
'loading_create_another_cta' => 'إنشاء منشور آخر',
'loading_tip_credits' => 'تستخدم كل صورة بالذكاء الاصطناعي حوالي 15 من الرصيد.',
'loading_tip_edit' => 'ستتمكن من تعديل كل شيء بمجرد أن يصبح المنشور جاهزًا.',
'loading_tip_draft' => 'تصل المنشورات المُنشأة إلى مسوداتك.',
'loading_tip_brand' => 'عدّل إعدادات علامتك التجارية للتأثير في المنشورات المستقبلية.',
'loading_tip_carousel' => 'تقدّم العروض الدائرية شريحة واحدة لكل صورة مرفوعة.',
'loading_tip_quality' => 'تم ضبط جودة الصورة لتحقيق توازن بين السرعة والتكلفة.',
'create' => 'إنشاء منشور',
'back' => 'رجوع',
'next' => 'متابعة',
'cancel' => 'إلغاء',
'discard' => 'تجاهل',
'retry' => 'إعادة المحاولة',
'no_platforms' => 'لا توجد حسابات متصلة',
'connect_first' => 'اربط حسابًا اجتماعيًا واحدًا على الأقل لاستخدام الإنشاء بالذكاء الاصطناعي.',
'no_account_for_template' => 'اربط حسابًا متوافقًا لاستخدام هذا القالب.',
'format' => [
'instagram_feed' => 'منشور خلاصة Instagram',
'instagram_carousel' => 'عرض Instagram الدائري',
'linkedin_post' => 'منشور LinkedIn',
'linkedin_page_post' => 'منشور صفحة LinkedIn',
'x_post' => 'منشور X',
'bluesky_post' => 'منشور Bluesky',
'threads_post' => 'منشور Threads',
'mastodon_post' => 'منشور Mastodon',
'telegram_post' => 'منشور Telegram',
'discord_message' => 'رسالة Discord',
'facebook_post' => 'منشور Facebook',
'pinterest_pin' => 'دبوس Pinterest',
'instagram_story' => 'قصة Instagram',
'facebook_story' => 'قصة Facebook',
],
],
],
];