From ab37505e681602d67ad447e3ad49588e905d48d9 Mon Sep 17 00:00:00 2001 From: SnapOtter Date: Mon, 22 Jun 2026 16:43:52 +0800 Subject: [PATCH] fix(i18n): translate Arabic (ar) UI strings (#314) Translate the ~950 previously-untranslated Arabic UI strings (tool names, descriptions, settings labels, dialogs) that were still showing English, and restore the {size} placeholder dropped from settings.aiFeatures.diskUsage. Machine-translated and verified: full key parity with en.ts, all {placeholders} preserved, passes tsc and Biome. Native-speaker review welcome. --- packages/shared/src/i18n/ar.ts | 1971 ++++++++++++++++---------------- 1 file changed, 984 insertions(+), 987 deletions(-) diff --git a/packages/shared/src/i18n/ar.ts b/packages/shared/src/i18n/ar.ts index 0ea36cf0..15503069 100644 --- a/packages/shared/src/i18n/ar.ts +++ b/packages/shared/src/i18n/ar.ts @@ -12,7 +12,7 @@ export const ar: TranslationKeys = { search: "البحث في الأدوات...", dropFiles: "اسحب الملفات هنا أو اضغط على زر الرفع", loading: "جاري التحميل...", - saving: "Saving...", + saving: "جارٍ الحفظ...", error: "حدث خطأ", confirm: "تأكيد", close: "إغلاق", @@ -37,40 +37,40 @@ export const ar: TranslationKeys = { unexpectedError: "حدث خطأ غير متوقع.", retry: "إعادة المحاولة", privacyPolicy: "سياسة الخصوصية", - pageNotFound: "Page not found", - pageNotFoundDescription: "The page you are looking for does not exist or has been moved.", + pageNotFound: "الصفحة غير موجودة", + pageNotFoundDescription: "الصفحة التي تبحث عنها غير موجودة أو تم نقلها.", }, categories: { essentials: "الأساسيات", adjustments: "التعديلات", - enhance: "Enhance & AI", + enhance: "تحسين و AI", watermark: "العلامة المائية والتراكب", layout: "التخطيط والتكوين", utilities: "الأدوات المساعدة", optimization: "التحسين", format: "التنسيق والتحويل", "video-edit": "Video", - "video-convert": "Convert", - "video-effects": "Effects & Compose", - "video-subtitles": "Subtitles", - "video-metadata": "Metadata", - "audio-edit": "Edit", - "audio-convert": "Convert", - "audio-effects": "Effects & Compose", - "audio-metadata": "Metadata", - "pdf-organize": "Organize", - "pdf-edit": "Edit & Annotate", - "pdf-security": "Security", - "pdf-optimize": "Optimize", - "doc-convert": "Convert", - data: "Files", - archives: "Archives", + "video-convert": "تحويل", + "video-effects": "تأثيرات ودمج", + "video-subtitles": "ترجمات", + "video-metadata": "بيانات وصفية", + "audio-edit": "تحرير", + "audio-convert": "تحويل", + "audio-effects": "تأثيرات ودمج", + "audio-metadata": "بيانات وصفية", + "pdf-organize": "ترتيب", + "pdf-edit": "تحرير وتعليق", + "pdf-security": "الأمان", + "pdf-optimize": "تحسين", + "doc-convert": "تحويل", + data: "ملفات", + archives: "أرشيفات", }, modalities: { - image: "Image", + image: "صورة", video: "Video", audio: "Audio", - documentsAndFiles: "PDF & Files", + documentsAndFiles: "PDF وملفات", }, tools: { resize: { @@ -264,8 +264,8 @@ export const ar: TranslationKeys = { description: "إنشاء رموز QR مخصصة بألوان وأنماط وشعارات مميزة", }, "html-to-image": { - name: "HTML to Image", - description: "Capture webpages as high-quality images", + name: "HTML إلى صورة", + description: "التقاط صفحات الويب كصور عالية الجودة", }, "barcode-read": { name: "قارئ الباركود", @@ -292,40 +292,40 @@ export const ar: TranslationKeys = { description: "إضافة خلفيات متدرجة وإطارات أجهزة وظلال وأحجام وسائل التواصل للقطات الشاشة", }, "circle-crop": { - name: "Circle Crop", - description: "Crop image to a centered circle with transparent corners", + name: "اقتصاص دائري", + description: "اقتصاص الصورة بشكل دائري في المنتصف مع زوايا شفافة", }, duotone: { - name: "Duotone", - description: "Apply a two-color duotone effect with custom shadow and highlight colors", + name: "ثنائي اللون", + description: "تطبيق تأثير ثنائي اللون مع ألوان ظلال وإبراز مخصصة", }, "image-pad": { - name: "Image Pad", - description: "Pad image to a target aspect ratio with a solid color background", + name: "حشو الصورة", + description: "حشو الصورة لنسبة عرض إلى ارتفاع محددة بخلفية لون موحد", }, pixelate: { - name: "Pixelate", - description: "Apply a pixelation effect to the full image or a specific region", + name: "بكسلة", + description: "تطبيق تأثير البكسلة على الصورة بالكامل أو منطقة محددة", }, vignette: { - name: "Vignette", - description: "Add a vignette effect with adjustable strength and color", + name: "تعتيم الحواف", + description: "إضافة تأثير تعتيم الحواف بقوة ولون قابلين للتعديل", }, "gif-webp": { - name: "GIF/WebP Converter", - description: "Convert animated GIF to WebP and vice versa, preserving all frames", + name: "محوّل GIF/WebP", + description: "تحويل GIF المتحرك إلى WebP والعكس مع الحفاظ على جميع الإطارات", }, histogram: { - name: "Histogram", - description: "Generate an RGB histogram chart from an image", + name: "مخطط الألوان", + description: "إنشاء مخطط بياني RGB للألوان من صورة", }, "lqip-placeholder": { - name: "LQIP Placeholder", - description: "Generate a tiny low-quality image placeholder with base64 data URI", + name: "عنصر نائب LQIP", + description: "إنشاء عنصر نائب صغير منخفض الجودة بصيغة base64 data URI", }, "sprite-sheet": { - name: "Sprite Sheet", - description: "Combine multiple images into a single sprite sheet grid", + name: "ورقة سبرايت", + description: "دمج صور متعددة في شبكة سبرايت واحدة", }, "svg-to-raster": { name: "SVG إلى صورة نقطية", @@ -346,383 +346,382 @@ export const ar: TranslationKeys = { description: "تحويل الصور إلى سلاسل Base64 لتضمينها في HTML و CSS والمزيد", }, "barcode-generate": { - name: "Barcode Generator", - description: "Generate barcodes in Code 128, EAN-13, UPC-A, Code 39, ITF-14, and Data Matrix", + name: "مولّد الباركود", + description: "إنشاء باركود بصيغ Code 128 وEAN-13 وUPC-A وCode 39 وITF-14 وData Matrix", }, "chart-maker": { - name: "Chart Maker", - description: "Create bar, line, or pie charts from CSV or JSON data", + name: "صانع المخططات", + description: "إنشاء مخططات أعمدة أو خطية أو دائرية من بيانات CSV أو JSON", }, "convert-video": { - name: "Convert Video", - description: "Convert videos between MP4, MOV, and WebM", + name: "تحويل الفيديو", + description: "تحويل الفيديو بين MP4 وMOV وWebM", }, "compress-video": { - name: "Compress Video", - description: "Shrink video file size with quality control", + name: "ضغط الفيديو", + description: "تقليل حجم ملف الفيديو مع التحكم بالجودة", }, "trim-video": { - name: "Trim Video", - description: "Cut a clip out of a video", + name: "قص الفيديو", + description: "قص مقطع من الفيديو", }, "mute-video": { - name: "Mute Video", - description: "Remove the audio track from a video", + name: "كتم صوت الفيديو", + description: "إزالة المسار الصوتي من الفيديو", }, "video-to-gif": { - name: "Video to GIF", - description: "Turn a video clip into an animated GIF", + name: "فيديو إلى GIF", + description: "تحويل مقطع فيديو إلى GIF متحرك", }, "resize-video": { - name: "Resize Video", - description: "Scale a video to a new resolution or preset size", + name: "تغيير حجم الفيديو", + description: "تغيير دقة الفيديو إلى حجم جديد أو حجم مُعدّ مسبقاً", }, "crop-video": { - name: "Crop Video", - description: "Crop a region out of a video", + name: "اقتصاص الفيديو", + description: "اقتصاص منطقة من الفيديو", }, "rotate-video": { - name: "Rotate Video", - description: "Rotate or flip a video", + name: "تدوير الفيديو", + description: "تدوير الفيديو أو قلبه", }, "change-fps": { - name: "Change FPS", - description: "Change the frame rate of a video", + name: "تغيير FPS", + description: "تغيير معدل إطارات الفيديو", }, "video-color": { - name: "Video Color", - description: "Adjust brightness, contrast, saturation, and gamma", + name: "ألوان الفيديو", + description: "ضبط السطوع والتباين والتشبع وغاما", }, "video-speed": { - name: "Video Speed", - description: "Speed up or slow down a video", + name: "سرعة الفيديو", + description: "تسريع أو إبطاء الفيديو", }, "reverse-video": { - name: "Reverse Video", - description: "Play a video clip backwards", + name: "عكس الفيديو", + description: "تشغيل مقطع الفيديو بالعكس", }, "video-loudnorm": { - name: "Normalize Audio", - description: "Normalize video audio volume to broadcast standard", + name: "تسوية الصوت", + description: "تسوية مستوى صوت الفيديو وفق معيار البث", }, "aspect-pad": { - name: "Aspect Pad", - description: "Add solid-color bars to fit a target aspect ratio", + name: "حشو النسبة", + description: "إضافة أشرطة بلون موحد لمطابقة نسبة العرض إلى الارتفاع المطلوبة", }, "blur-pad": { - name: "Blur Pad", - description: "Fill bars with a blurred copy of the video", + name: "حشو ضبابي", + description: "ملء الأشرطة بنسخة ضبابية من الفيديو", }, "watermark-video": { - name: "Watermark Video", - description: "Burn a text watermark onto video frames", + name: "علامة مائية للفيديو", + description: "حرق علامة مائية نصية على إطارات الفيديو", }, "stabilize-video": { - name: "Stabilize Video", - description: "Reduce camera shake with two-pass stabilization", + name: "تثبيت الفيديو", + description: "تقليل اهتزاز الكاميرا بتثبيت ثنائي المرور", }, "gif-to-video": { - name: "GIF to Video", - description: "Convert an animated GIF into an MP4 or WebM video", + name: "GIF إلى فيديو", + description: "تحويل GIF متحرك إلى فيديو MP4 أو WebM", }, "video-to-webp": { - name: "Video to WebP", - description: "Convert a video clip into an animated WebP image", + name: "فيديو إلى WebP", + description: "تحويل مقطع فيديو إلى صورة WebP متحركة", }, "video-to-frames": { - name: "Video to Frames", - description: "Extract frames from a video as a ZIP of images", + name: "فيديو إلى إطارات", + description: "استخراج إطارات من الفيديو كملف ZIP من الصور", }, "merge-videos": { - name: "Merge Videos", - description: "Join multiple video clips into one file", + name: "دمج الفيديوهات", + description: "دمج مقاطع فيديو متعددة في ملف واحد", }, "replace-audio": { - name: "Replace Audio", - description: "Swap the audio track of a video with another file", + name: "استبدال الصوت", + description: "استبدال المسار الصوتي للفيديو بملف آخر", }, "burn-subtitles": { - name: "Burn Subtitles", - description: "Permanently render subtitles onto video frames", + name: "حرق الترجمات", + description: "حرق الترجمات بشكل دائم على إطارات الفيديو", }, "embed-subtitles": { - name: "Embed Subtitles", - description: "Mux a subtitle track into the video container", + name: "تضمين الترجمات", + description: "تضمين مسار الترجمة في حاوية الفيديو", }, "extract-subtitles": { - name: "Extract Subtitles", - description: "Pull the subtitle track out of a video as an SRT file", + name: "استخراج الترجمات", + description: "استخراج مسار الترجمة من الفيديو كملف SRT", }, "images-to-video": { - name: "Images to Video", - description: "Turn a set of images into a slideshow video", + name: "صور إلى فيديو", + description: "تحويل مجموعة صور إلى فيديو عرض شرائح", }, "video-metadata": { - name: "Clean Video Metadata", - description: "Strip metadata from a video and report what was found", + name: "تنظيف بيانات الفيديو الوصفية", + description: "إزالة البيانات الوصفية من الفيديو وعرض ما تم العثور عليه", }, "convert-audio": { - name: "Convert Audio", - description: "Convert audio between MP3, WAV, OGG, and more", + name: "تحويل الصوت", + description: "تحويل الصوت بين MP3 وWAV وOGG والمزيد", }, "trim-audio": { - name: "Trim Audio", - description: "Cut a section out of an audio file", + name: "قص الصوت", + description: "قص جزء من ملف صوتي", }, "extract-audio": { - name: "Extract Audio", - description: "Pull the audio track out of a video", + name: "استخراج الصوت", + description: "استخراج المسار الصوتي من الفيديو", }, "volume-adjust": { - name: "Volume Adjust", - description: "Increase or decrease audio volume by a fixed gain", + name: "ضبط مستوى الصوت", + description: "رفع أو خفض مستوى الصوت بمقدار ثابت", }, "normalize-audio": { - name: "Normalize Audio", - description: "Even out loudness to broadcast standard levels", + name: "تسوية الصوت", + description: "تسوية مستوى الصوت وفق معايير البث", }, "fade-audio": { - name: "Fade Audio", - description: "Add fade-in and fade-out effects to audio", + name: "تلاشي الصوت", + description: "إضافة تأثيرات تلاشي الدخول والخروج للصوت", }, "reverse-audio": { - name: "Reverse Audio", - description: "Play audio backwards", + name: "عكس الصوت", + description: "تشغيل الصوت بالعكس", }, "audio-speed": { - name: "Audio Speed", - description: "Speed up or slow down audio playback", + name: "سرعة الصوت", + description: "تسريع أو إبطاء تشغيل الصوت", }, "pitch-shift": { - name: "Pitch Shift", - description: "Raise or lower pitch by semitones without changing speed", + name: "تغيير طبقة الصوت", + description: "رفع أو خفض طبقة الصوت بأنصاف نغمات دون تغيير السرعة", }, "audio-channels": { - name: "Audio Channels", - description: "Convert between mono, stereo, or swap left and right channels", + name: "قنوات الصوت", + description: "التحويل بين أحادي وستيريو أو تبديل القناتين اليمنى واليسرى", }, "silence-removal": { - name: "Silence Removal", - description: "Strip silent sections from audio", + name: "إزالة الصمت", + description: "إزالة المقاطع الصامتة من الصوت", }, "noise-reduction": { - name: "Noise Reduction", - description: "Reduce background noise with FFT-based denoising", + name: "تقليل الضوضاء", + description: "تقليل ضوضاء الخلفية باستخدام إزالة ضوضاء FFT", }, "merge-audio": { - name: "Merge Audio", - description: "Combine multiple audio files into one", + name: "دمج الصوت", + description: "دمج ملفات صوتية متعددة في ملف واحد", }, "split-audio": { - name: "Split Audio", - description: "Split audio by time, equal parts, or silence detection", + name: "تقسيم الصوت", + description: "تقسيم الصوت حسب الوقت أو أجزاء متساوية أو كشف الصمت", }, "ringtone-maker": { - name: "Ringtone Maker", - description: "Create a ringtone clip from any audio file", + name: "صانع النغمات", + description: "إنشاء مقطع نغمة رنين من أي ملف صوتي", }, "waveform-image": { - name: "Waveform Image", - description: "Generate a waveform visualization as a PNG image", + name: "صورة شكل الموجة", + description: "إنشاء تصوير شكل الموجة كصورة PNG", }, "audio-metadata": { - name: "Audio Metadata", - description: "View, edit, or strip audio tags (ID3)", + name: "بيانات الصوت الوصفية", + description: "عرض أو تعديل أو إزالة وسوم الصوت (ID3)", }, "merge-pdf": { - name: "Merge PDFs", - description: "Combine multiple PDFs into one", + name: "دمج ملفات PDF", + description: "دمج ملفات PDF متعددة في ملف واحد", }, "split-pdf": { - name: "Split PDF", - description: "Extract pages or split into parts", + name: "تقسيم PDF", + description: "استخراج صفحات أو تقسيم إلى أجزاء", }, "compress-pdf": { - name: "Compress PDF", - description: "Shrink PDF file size", + name: "ضغط PDF", + description: "تقليل حجم ملف PDF", }, "rotate-pdf": { - name: "Rotate PDF", - description: "Rotate pages in a PDF", + name: "تدوير PDF", + description: "تدوير صفحات PDF", }, "convert-document": { - name: "Convert Document", - description: "Convert between Word, OpenDocument, RTF, and plain text formats", + name: "تحويل مستند", + description: "التحويل بين صيغ Word وOpenDocument وRTF والنص العادي", }, "convert-presentation": { - name: "Convert Presentation", - description: "Convert between PowerPoint and OpenDocument presentation formats", + name: "تحويل عرض تقديمي", + description: "التحويل بين صيغ عروض PowerPoint وOpenDocument", }, "convert-spreadsheet": { - name: "Convert Spreadsheet", + name: "تحويل جدول بيانات", description: - "Convert between Excel, OpenDocument, and CSV formats. Multi-sheet workbooks export the first sheet to CSV.", + "التحويل بين صيغ Excel وOpenDocument وCSV. المصنفات متعددة الأوراق تصدّر الورقة الأولى إلى CSV.", }, "excel-to-pdf": { - name: "Excel to PDF", - description: "Convert spreadsheets to PDF. Wide sheets may paginate across multiple pages.", + name: "Excel إلى PDF", + description: "تحويل جداول البيانات إلى PDF. الأوراق العريضة قد تمتد على عدة صفحات.", }, "word-to-pdf": { - name: "Word to PDF", - description: "Convert Word documents to PDF", + name: "Word إلى PDF", + description: "تحويل مستندات Word إلى PDF", }, "extract-pages": { - name: "Extract Pages", - description: "Pull selected pages into a new PDF", + name: "استخراج صفحات", + description: "استخراج الصفحات المحددة إلى ملف PDF جديد", }, "remove-pages": { - name: "Remove Pages", - description: "Delete specific pages from a PDF", + name: "حذف صفحات", + description: "حذف صفحات محددة من ملف PDF", }, "organize-pdf": { - name: "Organize PDF", - description: "Reorder pages with an explicit page order", + name: "ترتيب PDF", + description: "إعادة ترتيب الصفحات بتسلسل محدد", }, "protect-pdf": { - name: "Protect PDF", - description: "Add password protection (AES-256 encryption)", + name: "حماية PDF", + description: "إضافة حماية بكلمة مرور (تشفير AES-256)", }, "unlock-pdf": { - name: "Unlock PDF", - description: "Remove password protection from a PDF", + name: "فتح قفل PDF", + description: "إزالة حماية كلمة المرور من ملف PDF", }, "repair-pdf": { - name: "Repair PDF", - description: "Attempt to repair a damaged or corrupted PDF", + name: "إصلاح PDF", + description: "محاولة إصلاح ملف PDF تالف أو معطوب", }, "linearize-pdf": { - name: "Web-Optimize PDF", - description: "Linearize a PDF for fast web viewing", + name: "تحسين PDF للويب", + description: "تحسين ملف PDF للعرض السريع على الويب", }, "grayscale-pdf": { - name: "Grayscale PDF", - description: "Convert all colors to grayscale", + name: "PDF بتدرج رمادي", + description: "تحويل جميع الألوان إلى تدرج رمادي", }, "pdfa-convert": { - name: "PDF/A Convert", - description: "Convert to archival PDF/A-2", + name: "تحويل PDF/A", + description: "التحويل إلى صيغة الأرشفة PDF/A-2", }, "crop-pdf": { - name: "Crop PDF", - description: "Crop all pages with a uniform margin", + name: "اقتصاص PDF", + description: "اقتصاص جميع الصفحات بهامش موحد", }, "nup-pdf": { - name: "N-up PDF", - description: "Arrange multiple pages per sheet", + name: "تجميع صفحات PDF", + description: "ترتيب عدة صفحات في ورقة واحدة", }, "booklet-pdf": { - name: "Booklet PDF", - description: "Arrange pages for folding into a booklet", + name: "كتيّب PDF", + description: "ترتيب الصفحات للطي ككتيّب", }, "watermark-pdf": { - name: "Watermark PDF", - description: "Add a text watermark to every page", + name: "علامة مائية PDF", + description: "إضافة علامة مائية نصية لكل صفحة", }, "pdf-page-numbers": { - name: "PDF Page Numbers", - description: "Add page numbers to every page", + name: "ترقيم صفحات PDF", + description: "إضافة أرقام الصفحات لكل صفحة", }, "flatten-pdf": { - name: "Flatten PDF", - description: "Bake forms and annotations into page content", + name: "تسطيح PDF", + description: "دمج النماذج والتعليقات في محتوى الصفحة", }, "redact-pdf": { - name: "Redact PDF", - description: "Permanently remove text occurrences (verified true redaction)", + name: "تنقيح PDF", + description: "إزالة النصوص بشكل دائم (تنقيح حقيقي مُتحقّق منه)", }, "pdf-to-text": { - name: "PDF to Text", - description: "Extract plain text from a PDF", + name: "PDF إلى نص", + description: "استخراج النص العادي من ملف PDF", }, "pdf-to-word": { - name: "PDF to Word", - description: "Best for text-based PDFs; scanned pages need OCR", + name: "PDF إلى Word", + description: "الأفضل لملفات PDF النصية؛ الصفحات الممسوحة تحتاج OCR", }, "pdf-metadata": { - name: "PDF Metadata", - description: "Read and write PDF document metadata", + name: "بيانات PDF الوصفية", + description: "قراءة وكتابة البيانات الوصفية لمستند PDF", }, "powerpoint-to-pdf": { - name: "PowerPoint to PDF", - description: "Convert presentations to PDF", + name: "PowerPoint إلى PDF", + description: "تحويل العروض التقديمية إلى PDF", }, "html-to-pdf": { - name: "HTML to PDF", - description: "Convert an HTML file to PDF. Remote resources are disabled for privacy.", + name: "HTML إلى PDF", + description: "تحويل ملف HTML إلى PDF. الموارد الخارجية معطّلة لحماية الخصوصية.", }, "markdown-to-docx": { - name: "Markdown to Word", - description: "Convert a Markdown file to a Word document (DOCX)", + name: "Markdown إلى Word", + description: "تحويل ملف Markdown إلى مستند Word (DOCX)", }, "markdown-to-html": { - name: "Markdown to HTML", + name: "Markdown إلى HTML", description: - "Convert a Markdown file to a standalone HTML page. Remote images in the source are left as-is in the output.", + "تحويل ملف Markdown إلى صفحة HTML مستقلة. الصور الخارجية في المصدر تبقى كما هي في المخرجات.", }, "markdown-to-pdf": { - name: "Markdown to PDF", - description: - "Convert a Markdown file to a styled PDF. Remote resources are disabled for privacy.", + name: "Markdown إلى PDF", + description: "تحويل ملف Markdown إلى PDF منسّق. الموارد الخارجية معطّلة لحماية الخصوصية.", }, "epub-convert": { - name: "Convert EPUB", + name: "تحويل EPUB", description: - "Convert an EPUB to PDF, DOCX, HTML, or Markdown. Remote resources inside the book are not fetched.", + "تحويل EPUB إلى PDF أو DOCX أو HTML أو Markdown. الموارد الخارجية داخل الكتاب لا يتم جلبها.", }, "to-epub": { - name: "Convert to EPUB", - description: "Convert Word, Markdown, HTML, or plain text files to EPUB", + name: "التحويل إلى EPUB", + description: "تحويل ملفات Word أو Markdown أو HTML أو النص العادي إلى EPUB", }, "csv-excel": { - name: "CSV to Excel", - description: "Convert between CSV and Excel (XLSX), both directions", + name: "CSV إلى Excel", + description: "التحويل بين CSV وExcel (XLSX) في الاتجاهين", }, "csv-json": { - name: "CSV to JSON", - description: "Convert between CSV and JSON, both directions", + name: "CSV إلى JSON", + description: "التحويل بين CSV وJSON في الاتجاهين", }, "json-xml": { - name: "JSON to XML", - description: "Convert between JSON and XML, both directions", + name: "JSON إلى XML", + description: "التحويل بين JSON وXML في الاتجاهين", }, "split-csv": { - name: "Split CSV", - description: "Split a CSV into smaller files by row count", + name: "تقسيم CSV", + description: "تقسيم ملف CSV إلى ملفات أصغر حسب عدد الصفوف", }, "merge-csvs": { - name: "Merge CSVs", - description: "Combine multiple CSV or TSV files with matching columns into one", + name: "دمج ملفات CSV", + description: "دمج ملفات CSV أو TSV متعددة ذات أعمدة متطابقة في ملف واحد", }, "yaml-json": { name: "YAML / JSON", - description: "Convert between YAML and JSON, both directions", + description: "التحويل بين YAML وJSON في الاتجاهين", }, "xml-to-csv": { - name: "XML to CSV", - description: "Extract repeating elements from XML into a CSV table", + name: "XML إلى CSV", + description: "استخراج العناصر المتكررة من XML إلى جدول CSV", }, "create-zip": { - name: "Create ZIP", - description: "Bundle multiple files into a single ZIP archive", + name: "إنشاء ZIP", + description: "تجميع ملفات متعددة في أرشيف ZIP واحد", }, "extract-zip": { - name: "Extract ZIP", + name: "استخراج ZIP", description: - "Safely extract files from a ZIP archive with bomb protection. Single-file archives return the file directly.", + "استخراج الملفات بأمان من أرشيف ZIP مع حماية من الأرشيفات الضارة. الأرشيفات ذات الملف الواحد تعيد الملف مباشرة.", }, pipeline: { name: "منشئ Pipeline", description: "ربط عدة أدوات في سير عمل واحد", }, - processing: { canceled: "Processing canceled" }, + processing: { canceled: "تم إلغاء المعالجة" }, mediaPlayer: { - unsupported: "Your browser does not support this media format.", + unsupported: "متصفحك لا يدعم صيغة الوسائط هذه.", }, documentView: { - loadFailed: "Failed to load document.", - previousPage: "Previous page", - nextPage: "Next page", - inputNotPreviewable: "Preview not available for this file type", + loadFailed: "فشل تحميل المستند.", + previousPage: "الصفحة السابقة", + nextPage: "الصفحة التالية", + inputNotPreviewable: "المعاينة غير متاحة لهذا النوع من الملفات", }, }, toolSettings: { @@ -1047,13 +1046,13 @@ export const ar: TranslationKeys = { intensity: "الشدة", addShadow: "إضافة ظل", opacity: "الشفافية", - outputFormat: "Output Format", - edgeSmoothing: "Edge Smoothing", - edgeSmoothingOff: "Off", - edgeSmoothingLight: "Light", - edgeSmoothingMedium: "Medium", - edgeSmoothingStrong: "Strong", - colorDecontamination: "Color Decontamination", + outputFormat: "صيغة المخرجات", + edgeSmoothing: "تنعيم الحواف", + edgeSmoothingOff: "إيقاف", + edgeSmoothingLight: "خفيف", + edgeSmoothingMedium: "متوسط", + edgeSmoothingStrong: "قوي", + colorDecontamination: "تنقية الألوان", rendering: "جاري المعالجة...", submit: "إزالة الخلفية", submitBatch: "إزالة الخلفية ({count} ملف)", @@ -1104,7 +1103,7 @@ export const ar: TranslationKeys = { language: "اللغة", autoDetect: "اكتشاف تلقائي", pages: "الصفحات", - pagesPlaceholder: "all, 1-3, 5", + pagesPlaceholder: "الكل، 1-3، 5", pagesHint: "ادخل ارقام الصفحات او النطاقات (مثال 1-3, 5, 8-10). الحد الاقصى 50 صفحة.", submit: "استخراج النص", submitBatch: "استخراج النص ({count} ملف)", @@ -1413,8 +1412,8 @@ export const ar: TranslationKeys = { submit: "إضافة نص", submitBatch: "إضافة نص ({count} ملف)", progressLabel: "جاري إضافة النص", - download: "Download", - defaultText: "Your Text Here", + download: "تنزيل", + defaultText: "نصك هنا", }, compose: { uploadOverlay: "رفع صورة التراكب", @@ -1456,13 +1455,13 @@ export const ar: TranslationKeys = { hasExif: "بيانات EXIF", hasIcc: "بيانات ICC", hasXmp: "بيانات XMP", - readInfo: "Read Info", - reading: "Reading...", - channelStats: "Channel Stats", - yes: "Yes", - no: "No", - na: "N/A", - failedToRead: "Failed to read info", + readInfo: "قراءة المعلومات", + reading: "جارٍ القراءة...", + channelStats: "إحصائيات القنوات", + yes: "نعم", + no: "لا", + na: "غير متاح", + failedToRead: "فشلت قراءة المعلومات", }, compare: { uploadSecondImage: "رفع الصورة الثانية", @@ -1510,29 +1509,29 @@ export const ar: TranslationKeys = { }, "html-to-image": { modeUrl: "URL", - modeHtml: "HTML File", - htmlFile: "HTML File", + modeHtml: "ملف HTML", + htmlFile: "ملف HTML", url: "URL", urlPlaceholder: "https://snapotter.com", - format: "Output Format", - quality: "Quality", - devicePreset: "Device", - viewportWidth: "Width", - viewportHeight: "Height", - fullPage: "Full Page", - submit: "Capture", - download: "Download Screenshot", - capturing: "Capturing webpage...", - errorTimeout: "Page took too long to load", - errorBlocked: "This URL cannot be captured", - errorUnavailable: "Screenshot service is not available", - errorFailed: "Failed to capture the page", - placeholder: "Enter a URL and click Capture", + format: "صيغة المخرجات", + quality: "الجودة", + devicePreset: "الجهاز", + viewportWidth: "العرض", + viewportHeight: "الارتفاع", + fullPage: "الصفحة كاملة", + submit: "التقاط", + download: "تنزيل لقطة الشاشة", + capturing: "جارٍ التقاط الصفحة...", + errorTimeout: "استغرق تحميل الصفحة وقتًا طويلًا", + errorBlocked: "لا يمكن التقاط عنوان URL هذا", + errorUnavailable: "خدمة لقطة الشاشة غير متاحة", + errorFailed: "فشل التقاط الصفحة", + placeholder: "أدخل عنوان URL واضغط التقاط", presets: { desktop: "Desktop", tablet: "Tablet", mobile: "Mobile", - custom: "Custom", + custom: "مخصص", }, }, "barcode-read": { @@ -1624,61 +1623,61 @@ export const ar: TranslationKeys = { progressLabel: "جاري تجميل لقطة الشاشة", }, "circle-crop": { - submit: "Circle Crop", - submitBatch: "Circle Crop ({count} files)", - progressLabel: "Cropping to circle", + submit: "اقتصاص دائري", + submitBatch: "اقتصاص دائري ({count} ملفات)", + progressLabel: "جارٍ الاقتصاص الدائري", }, duotone: { - shadow: "Shadow Color", - highlight: "Highlight Color", - submit: "Apply Duotone", - submitBatch: "Apply Duotone ({count} files)", - progressLabel: "Applying duotone", + shadow: "لون الظل", + highlight: "لون الإبراز", + submit: "تطبيق ثنائي اللون", + submitBatch: "تطبيق ثنائي اللون ({count} ملفات)", + progressLabel: "جارٍ تطبيق ثنائي اللون", }, "image-pad": { - target: "Target Ratio", - color: "Background Color", - submit: "Pad Image", - submitBatch: "Pad Image ({count} files)", - progressLabel: "Padding image", + target: "النسبة المستهدفة", + color: "لون الخلفية", + submit: "حشو الصورة", + submitBatch: "حشو الصورة ({count} ملفات)", + progressLabel: "جارٍ حشو الصورة", }, pixelate: { - blockSize: "Block Size", - submit: "Pixelate", - submitBatch: "Pixelate ({count} files)", - progressLabel: "Pixelating", + blockSize: "حجم الكتلة", + submit: "بكسلة", + submitBatch: "بكسلة ({count} ملفات)", + progressLabel: "جارٍ البكسلة", }, vignette: { - strength: "Strength", - color: "Vignette Color", - submit: "Apply Vignette", - submitBatch: "Apply Vignette ({count} files)", - progressLabel: "Applying vignette", + strength: "الشدة", + color: "لون التظليل", + submit: "تطبيق التظليل", + submitBatch: "تطبيق التظليل ({count} ملفات)", + progressLabel: "جارٍ تطبيق التظليل", }, "gif-webp": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting animation", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ تحويل الرسوم المتحركة", }, histogram: { - submit: "Generate Histogram", - submitBatch: "Generate Histogram ({count} files)", - progressLabel: "Generating histogram", + submit: "إنشاء مخطط بياني", + submitBatch: "إنشاء مخطط بياني ({count} ملفات)", + progressLabel: "جارٍ إنشاء المخطط البياني", }, "lqip-placeholder": { - width: "Width", - blur: "Blur", - submit: "Generate Placeholder", - submitBatch: "Generate Placeholder ({count} files)", - progressLabel: "Generating placeholder", + width: "العرض", + blur: "تمويه", + submit: "إنشاء عنصر نائب", + submitBatch: "إنشاء عنصر نائب ({count} ملفات)", + progressLabel: "جارٍ إنشاء العنصر النائب", }, "sprite-sheet": { - columns: "Columns", - padding: "Padding", - background: "Background Color", - submit: "Create Sprite Sheet", - submitBatch: "Create Sprite Sheet", - progressLabel: "Creating sprite sheet", + columns: "الأعمدة", + padding: "الحشو", + background: "لون الخلفية", + submit: "إنشاء ورقة سبرايت", + submitBatch: "إنشاء ورقة سبرايت", + progressLabel: "جارٍ إنشاء ورقة سبرايت", }, "svg-to-raster": { outputFormat: "صيغة الإخراج", @@ -1762,21 +1761,21 @@ export const ar: TranslationKeys = { copyCssUrl: "نسخ CSS url()", }, "barcode-generate": { - text: "Text", - type: "Barcode Type", - scale: "Scale", - includeText: "Include Text", - submit: "Generate Barcode", - download: "Download Barcode", + text: "النص", + type: "نوع الباركود", + scale: "المقياس", + includeText: "تضمين النص", + submit: "إنشاء باركود", + download: "تنزيل الباركود", }, "chart-maker": { - kind: "Chart Type", - title: "Title", - width: "Width", - height: "Height", - submit: "Create Chart", - submitBatch: "Create Chart ({count} files)", - progressLabel: "Creating chart", + kind: "نوع الرسم البياني", + title: "العنوان", + width: "العرض", + height: "الارتفاع", + submit: "إنشاء رسم بياني", + submitBatch: "إنشاء رسم بياني ({count} ملفات)", + progressLabel: "جارٍ إنشاء الرسم البياني", }, "enhance-faces-standalone": { model: "النموذج", @@ -1785,623 +1784,623 @@ export const ar: TranslationKeys = { best: "الأفضل", }, "convert-video": { - format: "Output format", - quality: "Quality", - high: "High", - balanced: "Balanced", - small: "Smallest", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "تنسيق الإخراج", + quality: "الجودة", + high: "عالية", + balanced: "متوازنة", + small: "الأصغر", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "compress-video": { - quality: "Compression", - light: "Light", - balanced: "Balanced", - strong: "Strong", - resolution: "Resolution", - original: "Original", - submit: "Compress", - submitBatch: "Compress ({count} files)", - progressLabel: "Compressing", + quality: "الضغط", + light: "خفيف", + balanced: "متوازن", + strong: "قوي", + resolution: "الدقة", + original: "أصلية", + submit: "ضغط", + submitBatch: "ضغط ({count} ملفات)", + progressLabel: "جارٍ الضغط", }, "trim-video": { - start: "Start (seconds)", - end: "End (seconds)", - precise: "Frame-accurate (re-encodes)", - submit: "Trim", - submitBatch: "Trim ({count} files)", - progressLabel: "Trimming", + start: "البداية (ثوانٍ)", + end: "النهاية (ثوانٍ)", + precise: "دقة الإطار (إعادة ترميز)", + submit: "قص", + submitBatch: "قص ({count} ملفات)", + progressLabel: "جارٍ القص", }, "mute-video": { - submit: "Remove audio", - submitBatch: "Remove audio ({count} files)", - progressLabel: "Muting", + submit: "إزالة الصوت", + submitBatch: "إزالة الصوت ({count} ملفات)", + progressLabel: "جارٍ كتم الصوت", }, "video-to-gif": { - fps: "Frames per second", - width: "Width (px)", - start: "Start (seconds)", - duration: "Duration (seconds)", - submit: "Create GIF", - submitBatch: "Create GIFs ({count} files)", - progressLabel: "Creating GIF", + fps: "إطارات في الثانية", + width: "العرض (px)", + start: "البداية (ثوانٍ)", + duration: "المدة (ثوانٍ)", + submit: "إنشاء GIF", + submitBatch: "إنشاء GIF ({count} ملفات)", + progressLabel: "جارٍ إنشاء GIF", }, "resize-video": { preset: "Preset", - width: "Width (px)", - height: "Height (px)", - hint: "Leave one dimension empty to keep aspect ratio", - submit: "Resize", - submitBatch: "Resize ({count} files)", - progressLabel: "Resizing", + width: "العرض (px)", + height: "الارتفاع (px)", + hint: "اترك أحد الأبعاد فارغًا للحفاظ على نسبة العرض إلى الارتفاع", + submit: "تغيير الحجم", + submitBatch: "تغيير الحجم ({count} ملفات)", + progressLabel: "جارٍ تغيير الحجم", }, "crop-video": { - width: "Width (px)", - height: "Height (px)", - x: "X offset", - y: "Y offset", - submit: "Crop", - submitBatch: "Crop ({count} files)", - progressLabel: "Cropping", + width: "العرض (px)", + height: "الارتفاع (px)", + x: "إزاحة X", + y: "إزاحة Y", + submit: "اقتصاص", + submitBatch: "اقتصاص ({count} ملفات)", + progressLabel: "جارٍ الاقتصاص", }, "rotate-video": { - transform: "Transform", - cw90: "Rotate 90 clockwise", - ccw90: "Rotate 90 counter-clockwise", - rotate180: "Rotate 180", - hflip: "Flip horizontal", - vflip: "Flip vertical", - submit: "Rotate", - submitBatch: "Rotate ({count} files)", - progressLabel: "Rotating", + transform: "التحويل", + cw90: "تدوير 90 مع عقارب الساعة", + ccw90: "تدوير 90 عكس عقارب الساعة", + rotate180: "تدوير 180", + hflip: "قلب أفقي", + vflip: "قلب عمودي", + submit: "تدوير", + submitBatch: "تدوير ({count} ملفات)", + progressLabel: "جارٍ التدوير", }, "change-fps": { - fps: "Frames per second", - submit: "Change FPS", - submitBatch: "Change FPS ({count} files)", - progressLabel: "Changing FPS", + fps: "إطارات في الثانية", + submit: "تغيير fps", + submitBatch: "تغيير fps ({count} ملفات)", + progressLabel: "جارٍ تغيير fps", }, "video-color": { - brightness: "Brightness", - contrast: "Contrast", - saturation: "Saturation", + brightness: "السطوع", + contrast: "التباين", + saturation: "التشبع", gamma: "Gamma", - submit: "Apply", - submitBatch: "Apply ({count} files)", - progressLabel: "Adjusting color", + submit: "تطبيق", + submitBatch: "تطبيق ({count} ملفات)", + progressLabel: "جارٍ ضبط الألوان", }, "video-speed": { - factor: "Speed factor", - keepPitch: "Keep original pitch", - submit: "Change speed", - submitBatch: "Change speed ({count} files)", - progressLabel: "Changing speed", + factor: "معامل السرعة", + keepPitch: "الحفاظ على درجة الصوت الأصلية", + submit: "تغيير السرعة", + submitBatch: "تغيير السرعة ({count} ملفات)", + progressLabel: "جارٍ تغيير السرعة", }, "reverse-video": { - hint: "Limited to clips up to 5 minutes", - submit: "Reverse", - submitBatch: "Reverse ({count} files)", - progressLabel: "Reversing", + hint: "مقيد بمقاطع حتى 5 دقائق", + submit: "عكس", + submitBatch: "عكس ({count} ملفات)", + progressLabel: "جارٍ العكس", }, "video-loudnorm": { - hint: "Normalizes audio to EBU R128 broadcast standard", - submit: "Normalize", - submitBatch: "Normalize ({count} files)", - progressLabel: "Normalizing", + hint: "تسوية الصوت وفق معيار البث EBU R128", + submit: "تسوية", + submitBatch: "تسوية ({count} ملفات)", + progressLabel: "جارٍ التسوية", }, "aspect-pad": { - target: "Target ratio", - color: "Background color", - colorHint: "Hex color, e.g. #000000", - submit: "Pad", - submitBatch: "Pad ({count} files)", - progressLabel: "Padding", + target: "النسبة المستهدفة", + color: "لون الخلفية", + colorHint: "لون HEX، مثل #000000", + submit: "حشو", + submitBatch: "حشو ({count} ملفات)", + progressLabel: "جارٍ الحشو", }, "blur-pad": { - target: "Target ratio", - blur: "Blur strength", - submit: "Pad", - submitBatch: "Pad ({count} files)", - progressLabel: "Padding", + target: "النسبة المستهدفة", + blur: "شدة التمويه", + submit: "حشو", + submitBatch: "حشو ({count} ملفات)", + progressLabel: "جارٍ الحشو", }, "watermark-video": { - text: "Watermark text", - position: "Position", - fontSize: "Font size", - opacity: "Opacity", - color: "Color", - colorHint: "Hex color, e.g. #ffffff", - submit: "Watermark", - submitBatch: "Watermark ({count} files)", - progressLabel: "Watermarking", + text: "نص العلامة المائية", + position: "الموضع", + fontSize: "حجم الخط", + opacity: "الشفافية", + color: "اللون", + colorHint: "لون HEX، مثل #ffffff", + submit: "علامة مائية", + submitBatch: "علامة مائية ({count} ملفات)", + progressLabel: "جارٍ إضافة العلامة المائية", }, "stabilize-video": { - smoothing: "Smoothing", - hint: "Runs two passes and takes longer than most tools", - submit: "Stabilize", - submitBatch: "Stabilize ({count} files)", - progressLabel: "Stabilizing", + smoothing: "التنعيم", + hint: "يُجري مرورتين ويستغرق وقتًا أطول من معظم الأدوات", + submit: "تثبيت", + submitBatch: "تثبيت ({count} ملفات)", + progressLabel: "جارٍ التثبيت", }, "gif-to-video": { - format: "Output format", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "تنسيق الإخراج", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "video-to-webp": { - fps: "Frames per second", - width: "Width (px)", - quality: "Quality", - loop: "Loop animation", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + fps: "إطارات في الثانية", + width: "العرض (px)", + quality: "الجودة", + loop: "تكرار الرسوم المتحركة", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "video-to-frames": { - mode: "Extraction mode", - modeAll: "All frames", - modeNth: "Every Nth frame", - modeTimestamps: "Specific timestamps", - n: "Take every Nth frame", - timestamps: "Timestamps (seconds)", - timestampsHint: "Comma-separated, e.g. 0.5, 2, 4.5", - format: "Image format", - submit: "Extract Frames", - submitBatch: "Extract Frames ({count} files)", - progressLabel: "Extracting frames", + mode: "وضع الاستخراج", + modeAll: "جميع الإطارات", + modeNth: "كل إطار رقم N", + modeTimestamps: "أوقات محددة", + n: "أخذ كل إطار رقم N", + timestamps: "الأوقات (ثوانٍ)", + timestampsHint: "مفصولة بفواصل، مثل 0.5، 2، 4.5", + format: "تنسيق الصورة", + submit: "استخراج الإطارات", + submitBatch: "استخراج الإطارات ({count} ملفات)", + progressLabel: "جارٍ استخراج الإطارات", }, "merge-videos": { - hint: "Files are joined in upload order", - submit: "Merge", - submitBatch: "Merge ({count} files)", - progressLabel: "Merging", + hint: "يتم دمج الملفات بترتيب الرفع", + submit: "دمج", + submitBatch: "دمج ({count} ملفات)", + progressLabel: "جارٍ الدمج", }, "replace-audio": { - hint: "Upload the video first, then the audio", - submit: "Replace Audio", - submitBatch: "Replace Audio ({count} files)", - progressLabel: "Replacing audio", + hint: "ارفع الفيديو أولًا، ثم الصوت", + submit: "استبدال الصوت", + submitBatch: "استبدال الصوت ({count} ملفات)", + progressLabel: "جارٍ استبدال الصوت", }, "burn-subtitles": { - fontSize: "Font size", - hint: "Upload a video and a subtitle file (.srt or .vtt)", - submit: "Burn Subtitles", - submitBatch: "Burn Subtitles ({count} files)", - progressLabel: "Burning subtitles", + fontSize: "حجم الخط", + hint: "ارفع فيديو وملف ترجمة (.srt أو .vtt)", + submit: "حرق الترجمات", + submitBatch: "حرق الترجمات ({count} ملفات)", + progressLabel: "جارٍ حرق الترجمات", }, "embed-subtitles": { - language: "Language code", - languageHint: "Three-letter ISO 639-2 code, e.g. eng, spa, fra", - submit: "Embed Subtitles", - submitBatch: "Embed Subtitles ({count} files)", - progressLabel: "Embedding subtitles", + language: "رمز اللغة", + languageHint: "رمز ISO 639-2 من ثلاثة أحرف، مثل eng، spa، fra", + submit: "تضمين الترجمات", + submitBatch: "تضمين الترجمات ({count} ملفات)", + progressLabel: "جارٍ تضمين الترجمات", }, "extract-subtitles": { - submit: "Extract Subtitles", - submitBatch: "Extract Subtitles ({count} files)", - progressLabel: "Extracting subtitles", + submit: "استخراج الترجمات", + submitBatch: "استخراج الترجمات ({count} ملفات)", + progressLabel: "جارٍ استخراج الترجمات", }, "images-to-video": { - secondsPerImage: "Seconds per image", - resolution: "Resolution", - fps: "Frames per second", - submit: "Create Video", - submitBatch: "Create Video ({count} files)", - progressLabel: "Creating slideshow", + secondsPerImage: "ثوانٍ لكل صورة", + resolution: "الدقة", + fps: "إطارات في الثانية", + submit: "إنشاء فيديو", + submitBatch: "إنشاء فيديو ({count} ملفات)", + progressLabel: "جارٍ إنشاء عرض الشرائح", }, "video-metadata": { - hint: "Metadata report appears in the result", - submit: "Strip Metadata", - submitBatch: "Strip Metadata ({count} files)", - progressLabel: "Stripping metadata", + hint: "يظهر تقرير البيانات الوصفية في النتيجة", + submit: "إزالة البيانات الوصفية", + submitBatch: "إزالة البيانات الوصفية ({count} ملفات)", + progressLabel: "جارٍ إزالة البيانات الوصفية", }, "convert-audio": { - format: "Output format", - bitrate: "Bitrate (kbps)", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "تنسيق الإخراج", + bitrate: "معدل البت (kbps)", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "trim-audio": { - start: "Start (seconds)", - end: "End (seconds)", - submit: "Trim", - submitBatch: "Trim ({count} files)", - progressLabel: "Trimming", + start: "البداية (ثوانٍ)", + end: "النهاية (ثوانٍ)", + submit: "قص", + submitBatch: "قص ({count} ملفات)", + progressLabel: "جارٍ القص", }, "extract-audio": { - format: "Output format", - submit: "Extract", - submitBatch: "Extract ({count} files)", - progressLabel: "Extracting", + format: "تنسيق الإخراج", + submit: "استخراج", + submitBatch: "استخراج ({count} ملفات)", + progressLabel: "جارٍ الاستخراج", }, "volume-adjust": { - "gain-db": "Gain (dB)", - submit: "Adjust Volume", - submitBatch: "Adjust Volume ({count} files)", - progressLabel: "Adjusting volume", + "gain-db": "الكسب (dB)", + submit: "ضبط مستوى الصوت", + submitBatch: "ضبط مستوى الصوت ({count} ملفات)", + progressLabel: "جارٍ ضبط مستوى الصوت", }, "normalize-audio": { - hint: "EBU R128 loudness normalization", - submit: "Normalize", - submitBatch: "Normalize ({count} files)", - progressLabel: "Normalizing", + hint: "تسوية جهارة الصوت وفق معيار EBU R128", + submit: "تسوية", + submitBatch: "تسوية ({count} ملفات)", + progressLabel: "جارٍ التسوية", }, "fade-audio": { - "fade-in-s": "Fade in (seconds)", - "fade-out-s": "Fade out (seconds)", - submit: "Apply Fade", - submitBatch: "Apply Fade ({count} files)", - progressLabel: "Applying fade", + "fade-in-s": "ظهور تدريجي (ثوانٍ)", + "fade-out-s": "اختفاء تدريجي (ثوانٍ)", + submit: "تطبيق التلاشي", + submitBatch: "تطبيق التلاشي ({count} ملفات)", + progressLabel: "جارٍ تطبيق التلاشي", }, "reverse-audio": { - submit: "Reverse", - submitBatch: "Reverse ({count} files)", - progressLabel: "Reversing", + submit: "عكس", + submitBatch: "عكس ({count} ملفات)", + progressLabel: "جارٍ العكس", }, "audio-speed": { - factor: "Speed factor", - submit: "Change Speed", - submitBatch: "Change Speed ({count} files)", - progressLabel: "Changing speed", + factor: "معامل السرعة", + submit: "تغيير السرعة", + submitBatch: "تغيير السرعة ({count} ملفات)", + progressLabel: "جارٍ تغيير السرعة", }, "pitch-shift": { - semitones: "Semitones", - hint: "0 semitones is not allowed", - submit: "Shift Pitch", - submitBatch: "Shift Pitch ({count} files)", - progressLabel: "Shifting pitch", + semitones: "أنصاف النغمات", + hint: "لا يُسمح بصفر أنصاف نغمات", + submit: "تغيير طبقة الصوت", + submitBatch: "تغيير طبقة الصوت ({count} ملفات)", + progressLabel: "جارٍ تغيير طبقة الصوت", }, "audio-channels": { - mode: "Channel mode", - "stereo-to-mono": "Stereo to mono", - "mono-to-stereo": "Mono to stereo", - swap: "Swap left/right", - submit: "Convert Channels", - submitBatch: "Convert Channels ({count} files)", - progressLabel: "Converting channels", + mode: "وضع القنوات", + "stereo-to-mono": "من ستيريو إلى أحادي", + "mono-to-stereo": "من أحادي إلى ستيريو", + swap: "تبديل اليسار/اليمين", + submit: "تحويل القنوات", + submitBatch: "تحويل القنوات ({count} ملفات)", + progressLabel: "جارٍ تحويل القنوات", }, "silence-removal": { - "threshold-db": "Silence threshold (dB)", - "min-silence-s": "Minimum silence duration (seconds)", - submit: "Remove Silence", - submitBatch: "Remove Silence ({count} files)", - progressLabel: "Removing silence", + "threshold-db": "عتبة الصمت (dB)", + "min-silence-s": "الحد الأدنى لمدة الصمت (ثوانٍ)", + submit: "إزالة الصمت", + submitBatch: "إزالة الصمت ({count} ملفات)", + progressLabel: "جارٍ إزالة الصمت", }, "noise-reduction": { - strength: "Strength", - light: "Light", - medium: "Medium", - strong: "Strong", - submit: "Reduce Noise", - submitBatch: "Reduce Noise ({count} files)", - progressLabel: "Reducing noise", + strength: "الشدة", + light: "خفيف", + medium: "متوسط", + strong: "قوي", + submit: "تقليل الضوضاء", + submitBatch: "تقليل الضوضاء ({count} ملفات)", + progressLabel: "جارٍ تقليل الضوضاء", }, "merge-audio": { - format: "Output format", + format: "صيغة الإخراج", mp3: "MP3", wav: "WAV", flac: "FLAC", m4a: "M4A", - "order-hint": "Files will be joined in upload order", - submit: "Merge Audio", - submitBatch: "Merge Audio ({count} files)", - progressLabel: "Merging audio", + "order-hint": "سيتم دمج الملفات بترتيب الرفع", + submit: "دمج الصوت", + submitBatch: "دمج الصوت ({count} ملفات)", + progressLabel: "جارٍ دمج الصوت", }, "split-audio": { - mode: "Split mode", - time: "By time", - parts: "Equal parts", - silence: "By silence", - "segment-s": "Segment length (seconds)", - "num-parts": "Number of parts", - "threshold-db": "Silence threshold (dB)", - "min-silence-s": "Minimum silence duration (seconds)", - submit: "Split Audio", - submitBatch: "Split Audio ({count} files)", - progressLabel: "Splitting audio", + mode: "وضع التقسيم", + time: "بالوقت", + parts: "أجزاء متساوية", + silence: "بالصمت", + "segment-s": "مدة المقطع (ثوانٍ)", + "num-parts": "عدد الأجزاء", + "threshold-db": "عتبة الصمت (dB)", + "min-silence-s": "الحد الأدنى لمدة الصمت (ثوانٍ)", + submit: "تقسيم الصوت", + submitBatch: "تقسيم الصوت ({count} ملفات)", + progressLabel: "جارٍ تقسيم الصوت", }, "ringtone-maker": { - "start-s": "Start time (seconds)", - "duration-s": "Duration (seconds)", - "max-hint": "Maximum 30 seconds", - submit: "Create Ringtone", - submitBatch: "Create Ringtone ({count} files)", - progressLabel: "Creating ringtone", + "start-s": "وقت البدء (ثوانٍ)", + "duration-s": "المدة (ثوانٍ)", + "max-hint": "الحد الأقصى 30 ثانية", + submit: "إنشاء نغمة رنين", + submitBatch: "إنشاء نغمة رنين ({count} ملفات)", + progressLabel: "جارٍ إنشاء نغمة الرنين", }, "waveform-image": { - width: "Width (px)", - height: "Height (px)", - color: "Waveform color", - submit: "Generate Waveform", - submitBatch: "Generate Waveform ({count} files)", - progressLabel: "Generating waveform", + width: "العرض (px)", + height: "الارتفاع (px)", + color: "لون الموجة الصوتية", + submit: "إنشاء الموجة الصوتية", + submitBatch: "إنشاء الموجة الصوتية ({count} ملفات)", + progressLabel: "جارٍ إنشاء الموجة الصوتية", }, "audio-metadata": { - strip: "Strip all metadata", - title: "Title", - artist: "Artist", + strip: "إزالة جميع البيانات الوصفية", + title: "العنوان", + artist: "الفنان", album: "Album", - submit: "Apply Metadata", - submitBatch: "Apply Metadata ({count} files)", - progressLabel: "Applying metadata", + submit: "تطبيق البيانات الوصفية", + submitBatch: "تطبيق البيانات الوصفية ({count} ملفات)", + progressLabel: "جارٍ تطبيق البيانات الوصفية", }, "merge-pdf": { - addFiles: "Add PDFs to merge", - needTwo: "At least two PDFs are required", - orderHint: "{count} PDFs will merge in this order", - submit: "Merge", - submitBatch: "Merge ({count} files)", - progressLabel: "Merging", + addFiles: "أضف ملفات PDF للدمج", + needTwo: "يلزم ملفا PDF على الأقل", + orderHint: "سيتم دمج {count} ملفات PDF بهذا الترتيب", + submit: "دمج", + submitBatch: "دمج ({count} ملفات)", + progressLabel: "جارٍ الدمج", }, "split-pdf": { - mode: "Split mode", - range: "Page range", - rangeHint: "e.g. 1-3, 5, 7-z", - everyN: "Pages per part", - submit: "Split", - submitBatch: "Split ({count} files)", - progressLabel: "Splitting", + mode: "وضع التقسيم", + range: "نطاق الصفحات", + rangeHint: "مثال: 1-3, 5, 7-z", + everyN: "صفحات لكل جزء", + submit: "تقسيم", + submitBatch: "تقسيم ({count} ملفات)", + progressLabel: "جارٍ التقسيم", }, "compress-pdf": { - preset: "Quality preset", - screen: "Screen (smallest)", - ebook: "Ebook (balanced)", - printer: "Printer (best quality)", - submit: "Compress", - submitBatch: "Compress ({count} files)", - progressLabel: "Compressing", + preset: "إعداد الجودة", + screen: "شاشة (الأصغر حجمًا)", + ebook: "كتاب إلكتروني (متوازن)", + printer: "طباعة (أفضل جودة)", + submit: "ضغط", + submitBatch: "ضغط ({count} ملفات)", + progressLabel: "جارٍ الضغط", }, "rotate-pdf": { - angle: "Rotation angle", - range: "Page range", - rangeHint: "e.g. 1-3, 5, 1-z (all pages)", - submit: "Rotate", - submitBatch: "Rotate ({count} files)", - progressLabel: "Rotating", + angle: "زاوية التدوير", + range: "نطاق الصفحات", + rangeHint: "مثال: 1-3, 5, 1-z (جميع الصفحات)", + submit: "تدوير", + submitBatch: "تدوير ({count} ملفات)", + progressLabel: "جارٍ التدوير", }, "convert-document": { - format: "Output format", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "صيغة الإخراج", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "convert-presentation": { - format: "Output format", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "صيغة الإخراج", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "convert-spreadsheet": { - format: "Output format", - hint: "Multi-sheet workbooks export the first sheet to CSV.", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "صيغة الإخراج", + hint: "المصنفات متعددة الأوراق تُصدّر الورقة الأولى فقط إلى CSV.", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "excel-to-pdf": { - submit: "Convert to PDF", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "تحويل إلى PDF", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "powerpoint-to-pdf": { - submit: "Convert to PDF", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "تحويل إلى PDF", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "word-to-pdf": { - submit: "Convert to PDF", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "تحويل إلى PDF", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "extract-pages": { - range: "Page range", - rangeHint: "e.g. 1-3, 5, 7-z", - submit: "Extract", - submitBatch: "Extract ({count} files)", - progressLabel: "Extracting", + range: "نطاق الصفحات", + rangeHint: "مثال: 1-3, 5, 7-z", + submit: "استخراج", + submitBatch: "استخراج ({count} ملفات)", + progressLabel: "جارٍ الاستخراج", }, "remove-pages": { - pages: "Pages to remove", - pagesHint: "e.g. 2, 4-6, z (last page)", - submit: "Remove", - submitBatch: "Remove ({count} files)", - progressLabel: "Removing", + pages: "الصفحات المراد إزالتها", + pagesHint: "مثال: 2, 4-6, z (الصفحة الأخيرة)", + submit: "إزالة", + submitBatch: "إزالة ({count} ملفات)", + progressLabel: "جارٍ الإزالة", }, "organize-pdf": { - order: "Page order", - orderHint: "e.g. 3,1,2 or 1-z (identity)", - submit: "Reorder", - submitBatch: "Reorder ({count} files)", - progressLabel: "Reordering", + order: "ترتيب الصفحات", + orderHint: "مثال: 3,1,2 أو 1-z (بدون تغيير)", + submit: "إعادة الترتيب", + submitBatch: "إعادة الترتيب ({count} ملفات)", + progressLabel: "جارٍ إعادة الترتيب", }, "protect-pdf": { - userPassword: "User password", - ownerPassword: "Owner password (optional)", - ownerPasswordHint: "Defaults to user password if empty", - submit: "Protect", - submitBatch: "Protect ({count} files)", - progressLabel: "Encrypting", + userPassword: "كلمة مرور المستخدم", + ownerPassword: "كلمة مرور المالك (اختياري)", + ownerPasswordHint: "تُستخدم كلمة مرور المستخدم إذا تُركت فارغة", + submit: "حماية", + submitBatch: "حماية ({count} ملفات)", + progressLabel: "جارٍ التشفير", }, "unlock-pdf": { password: "Password", - submit: "Unlock", - submitBatch: "Unlock ({count} files)", - progressLabel: "Decrypting", + submit: "إلغاء القفل", + submitBatch: "إلغاء القفل ({count} ملفات)", + progressLabel: "جارٍ فك التشفير", }, "repair-pdf": { - submit: "Repair", - submitBatch: "Repair ({count} files)", - progressLabel: "Repairing", + submit: "إصلاح", + submitBatch: "إصلاح ({count} ملفات)", + progressLabel: "جارٍ الإصلاح", }, "linearize-pdf": { - submit: "Optimize", - submitBatch: "Optimize ({count} files)", - progressLabel: "Linearizing", + submit: "تحسين", + submitBatch: "تحسين ({count} ملفات)", + progressLabel: "جارٍ التحسين الخطي", }, "grayscale-pdf": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "pdfa-convert": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "crop-pdf": { - margin: "Margin (points)", - submit: "Crop", - submitBatch: "Crop ({count} files)", - progressLabel: "Cropping", + margin: "الهامش (نقاط)", + submit: "قص", + submitBatch: "قص ({count} ملفات)", + progressLabel: "جارٍ القص", }, "nup-pdf": { - perSheet: "Pages per sheet", - submit: "Arrange", - submitBatch: "Arrange ({count} files)", - progressLabel: "Arranging", + perSheet: "صفحات لكل ورقة", + submit: "ترتيب", + submitBatch: "ترتيب ({count} ملفات)", + progressLabel: "جارٍ الترتيب", }, "booklet-pdf": { - perSheet: "Pages per sheet", - submit: "Create Booklet", - submitBatch: "Create Booklet ({count} files)", - progressLabel: "Creating booklet", + perSheet: "صفحات لكل ورقة", + submit: "إنشاء كتيب", + submitBatch: "إنشاء كتيب ({count} ملفات)", + progressLabel: "جارٍ إنشاء الكتيب", }, "watermark-pdf": { - text: "Watermark text", - position: "Position", - fontSize: "Font size", - opacity: "Opacity", - rotation: "Rotation", - submit: "Watermark", - submitBatch: "Watermark ({count} files)", - progressLabel: "Watermarking", + text: "نص العلامة المائية", + position: "الموضع", + fontSize: "حجم الخط", + opacity: "الشفافية", + rotation: "الدوران", + submit: "إضافة علامة مائية", + submitBatch: "إضافة علامة مائية ({count} ملفات)", + progressLabel: "جارٍ إضافة العلامة المائية", }, "pdf-page-numbers": { - position: "Position", - fontSize: "Font size", - submit: "Add Numbers", - submitBatch: "Add Numbers ({count} files)", - progressLabel: "Numbering", + position: "الموضع", + fontSize: "حجم الخط", + submit: "إضافة أرقام", + submitBatch: "إضافة أرقام ({count} ملفات)", + progressLabel: "جارٍ الترقيم", }, "flatten-pdf": { - submit: "Flatten", - submitBatch: "Flatten ({count} files)", - progressLabel: "Flattening", + submit: "تسطيح", + submitBatch: "تسطيح ({count} ملفات)", + progressLabel: "جارٍ التسطيح", }, "redact-pdf": { - terms: "Terms to redact", - termsHint: "One term per line (max 50)", - caseSensitive: "Case sensitive", - submit: "Redact", - submitBatch: "Redact ({count} files)", - progressLabel: "Redacting", + terms: "العبارات المراد تنقيحها", + termsHint: "عبارة واحدة في كل سطر (50 كحد أقصى)", + caseSensitive: "حساس لحالة الأحرف", + submit: "تنقيح", + submitBatch: "تنقيح ({count} ملفات)", + progressLabel: "جارٍ التنقيح", }, "pdf-to-text": { - submit: "Extract Text", - submitBatch: "Extract Text ({count} files)", - progressLabel: "Extracting", + submit: "استخراج النص", + submitBatch: "استخراج النص ({count} ملفات)", + progressLabel: "جارٍ الاستخراج", }, "pdf-to-word": { - hint: "Best for text-based PDFs; scanned pages need OCR", - submit: "Convert to Word", - submitBatch: "Convert to Word ({count} files)", - progressLabel: "Converting", + hint: "الأنسب لملفات PDF النصية؛ الصفحات الممسوحة تحتاج OCR", + submit: "تحويل إلى Word", + submitBatch: "تحويل إلى Word ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "pdf-metadata": { - title: "Title", - author: "Author", - subject: "Subject", - keywords: "Keywords", - submit: "Set Metadata", - submitBatch: "Set Metadata ({count} files)", - progressLabel: "Setting metadata", + title: "العنوان", + author: "المؤلف", + subject: "الموضوع", + keywords: "الكلمات المفتاحية", + submit: "تعيين البيانات الوصفية", + submitBatch: "تعيين البيانات الوصفية ({count} ملفات)", + progressLabel: "جارٍ تعيين البيانات الوصفية", }, "html-to-pdf": { - hint: "Remote resources are disabled for privacy.", - submit: "Convert to PDF", - submitBatch: "Convert to PDF ({count} files)", - progressLabel: "Converting", + hint: "الموارد الخارجية معطّلة لأسباب تتعلق بالخصوصية.", + submit: "تحويل إلى PDF", + submitBatch: "تحويل إلى PDF ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "markdown-to-docx": { - submit: "Convert to DOCX", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "تحويل إلى DOCX", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "markdown-to-html": { - hint: "Remote images in the source are left as-is in the output.", - submit: "Convert to HTML", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + hint: "الصور الخارجية في المصدر تبقى كما هي في المخرجات.", + submit: "تحويل إلى HTML", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "markdown-to-pdf": { - hint: "Remote resources are disabled for privacy.", - submit: "Convert to PDF", - submitBatch: "Convert to PDF ({count} files)", - progressLabel: "Converting", + hint: "الموارد الخارجية معطّلة لأسباب تتعلق بالخصوصية.", + submit: "تحويل إلى PDF", + submitBatch: "تحويل إلى PDF ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "epub-convert": { - format: "Output format", - hint: "Remote resources inside the book are not fetched.", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "صيغة الإخراج", + hint: "لا يتم جلب الموارد الخارجية داخل الكتاب.", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "to-epub": { - submit: "Convert to EPUB", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "تحويل إلى EPUB", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "csv-excel": { - sheet: "Worksheet number", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + sheet: "رقم ورقة العمل", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "csv-json": { - pretty: "Pretty print", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + pretty: "تنسيق مرتب", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "json-xml": { - pretty: "Pretty print", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + pretty: "تنسيق مرتب", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "split-csv": { - rowsPerFile: "Rows per file", - keepHeader: "Keep header in each file", - submit: "Split", - submitBatch: "Split ({count} files)", - progressLabel: "Splitting", + rowsPerFile: "صفوف لكل ملف", + keepHeader: "الاحتفاظ بالترويسة في كل ملف", + submit: "تقسيم", + submitBatch: "تقسيم ({count} ملفات)", + progressLabel: "جارٍ التقسيم", }, "merge-csvs": { - submit: "Merge", - submitBatch: "Merge ({count} files)", - progressLabel: "Merging", + submit: "دمج", + submitBatch: "دمج ({count} ملفات)", + progressLabel: "جارٍ الدمج", }, "yaml-json": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "xml-to-csv": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "تحويل", + submitBatch: "تحويل ({count} ملفات)", + progressLabel: "جارٍ التحويل", }, "create-zip": { - submit: "Create ZIP", - submitBatch: "Create ZIP ({count} files)", - progressLabel: "Zipping", + submit: "إنشاء ZIP", + submitBatch: "إنشاء ZIP ({count} ملفات)", + progressLabel: "جارٍ الضغط", }, "extract-zip": { - submit: "Extract", - submitBatch: "Extract ({count} files)", - progressLabel: "Extracting", + submit: "استخراج", + submitBatch: "استخراج ({count} ملفات)", + progressLabel: "جارٍ الاستخراج", }, }, urlImport: { @@ -2443,35 +2442,35 @@ export const ar: TranslationKeys = { downloadAllZip: "تحميل الكل (ZIP)", hideSettings: "إخفاء الإعدادات", imageArea: "منطقة المعاينة", - disabledByAdmin: "This tool has been disabled by your administrator", - browseOtherTools: "Browse other tools", - privacyNote: "Files are processed on your server and never leave your network", + disabledByAdmin: "تم تعطيل هذه الأداة من قِبل المسؤول", + browseOtherTools: "تصفح أدوات أخرى", + privacyNote: "تُعالَج الملفات على خادمك ولا تغادر شبكتك أبدًا", applyAndDownload: "تطبيق وتنزيل", - andMore: "and {count} more", - importFromFiles: "Import from Files", - saveToFiles: "Save to Files", - savedToFiles: "Saved to Files", - adjustSettings: "Adjust settings", - startOver: "Start over with a new file", - newFile: "New file", - previewUnavailable: "Preview will be available after processing", - generatePreview: "Generate Preview", - previewFailed: "Preview generation failed", - backToTools: "Back to Tools", - original: "Original", - processed: "Processed", - saved: "Saved", - noChange: "no change", - download: "Download", + andMore: "و{count} أخرى", + importFromFiles: "استيراد من الملفات", + saveToFiles: "حفظ في الملفات", + savedToFiles: "تم الحفظ في الملفات", + adjustSettings: "ضبط الإعدادات", + startOver: "البدء من جديد بملف جديد", + newFile: "ملف جديد", + previewUnavailable: "ستتوفر المعاينة بعد المعالجة", + generatePreview: "إنشاء معاينة", + previewFailed: "فشل إنشاء المعاينة", + backToTools: "العودة إلى الأدوات", + original: "الأصلي", + processed: "المعالَج", + saved: "تم الحفظ", + noChange: "بدون تغيير", + download: "تنزيل", settingsSaved: "تم حفظ إعداداتك.", tryAgain: "حاول مرة أخرى", tryDifferentFile: "جرب ملفًا مختلفًا", - batchPartialSuccess: "{success} of {total} processed. {failed} failed.", - dataResultsHint: "Results shown above. Use the copy button in the results panel.", - downloadAsFile: "Download as file", - downloadAll: "Download All", - downloadFiles: "Download {count} files", - audioDecodeUnsupported: "This audio format cannot be previewed in the browser", + batchPartialSuccess: "تمت معالجة {success} من {total}. فشل {failed}.", + dataResultsHint: "النتائج معروضة أعلاه. استخدم زر النسخ في لوحة النتائج.", + downloadAsFile: "تنزيل كملف", + downloadAll: "تنزيل الكل", + downloadFiles: "تنزيل {count} ملفات", + audioDecodeUnsupported: "لا يمكن معاينة تنسيق الصوت هذا في المتصفح", }, homePage: { generatingPreview: "جاري إنشاء المعاينة...", @@ -2479,20 +2478,20 @@ export const ar: TranslationKeys = { changeFile: "تغيير الملف", quickActions: "إجراءات سريعة", allTools: "جميع الأدوات", - searchPlaceholder: "Search {count} tools...", - recent: "Recent", - popular: "Popular", - browseByCategory: "Browse by Category", - gettingStarted: "Getting Started", - noToolsMatch: "No tools match '{query}'", - clearSearch: "Clear search", - all: "All", + searchPlaceholder: "بحث في {count} أداة...", + recent: "الأخيرة", + popular: "الشائعة", + browseByCategory: "تصفح حسب الفئة", + gettingStarted: "البدء", + noToolsMatch: "لا توجد أدوات تطابق '{query}'", + clearSearch: "مسح البحث", + all: "الكل", documents: "PDF", - data: "Files", + data: "الملفات", pdf: "PDF", - files: "Files", - toolCount: "{count} tools", - heading: "SnapOtter Tools", + files: "الملفات", + toolCount: "{count} أداة", + heading: "أدوات SnapOtter", }, fullscreenGrid: { searchPlaceholder: "البحث في الأدوات...", @@ -2645,25 +2644,25 @@ export const ar: TranslationKeys = { serverDecodeFailed: "فشل فك الترميز من الخادم", }, shapes: { - shape: "Shape", - fill: "Fill", - stroke: "Stroke", - strokeWidth: "Width", - cornerRadius: "Radius", - sides: "Sides", - points: "Points", - dashStyle: "Dash", - solid: "Solid", - dashed: "Dashed", - dotted: "Dotted", - none: "None", - opacity: "Opacity", - rectangle: "Rectangle", - ellipse: "Ellipse", - line: "Line", - arrow: "Arrow", - polygon: "Polygon", - star: "Star", + shape: "شكل", + fill: "تعبئة", + stroke: "حد", + strokeWidth: "العرض", + cornerRadius: "نصف القطر", + sides: "الأضلاع", + points: "النقاط", + dashStyle: "نمط الخط", + solid: "متصل", + dashed: "متقطع", + dotted: "منقط", + none: "بدون", + opacity: "الشفافية", + rectangle: "مستطيل", + ellipse: "قطع ناقص", + line: "خط", + arrow: "سهم", + polygon: "مضلع", + star: "نجمة", }, }, settings: { @@ -2676,7 +2675,7 @@ export const ar: TranslationKeys = { teams: "الفرق", roles: "الأدوار", auditLog: "سجل التدقيق", - usage: "Usage", + usage: "الاستخدام", apiKeys: "مفاتيح API", aiFeatures: "ميزات AI", tools: "الأدوات", @@ -2737,10 +2736,10 @@ export const ar: TranslationKeys = { maxSplitGrid: "شبكة التقسيم القصوى", maxPdfPages: "صفحات PDF القصوى", sessionDuration: "مدة الجلسة", - supportBundleButton: "Download Support Bundle", + supportBundleButton: "تنزيل حزمة الدعم", supportBundleDescription: - "Download a diagnostic zip with redacted config, logs, and job data for troubleshooting.", - supportBundleFailed: "Failed to download support bundle.", + "تنزيل ملف تشخيصي مضغوط يحتوي على إعدادات محجوبة وسجلات وبيانات المهام لاستكشاف الأخطاء.", + supportBundleFailed: "فشل تنزيل حزمة الدعم.", }, security: { heading: "الأمان", @@ -2756,33 +2755,32 @@ export const ar: TranslationKeys = { currentPasswordIncorrect: "كلمة المرور الحالية غير صحيحة", changePasswordButton: "تغيير كلمة المرور", loginAttemptLimitNote: "يمكن ضبط حدود محاولات تسجيل الدخول في إعدادات النظام.", - adminHeading: "Admin Security Settings", - adminDescription: "Enterprise security policy settings. These apply to all users.", - sessionIdleTimeout: "Session Idle Timeout (minutes)", - sessionIdleTimeoutDesc: "Automatically log out idle sessions. 0 = disabled.", - maxSessionsPerUser: "Max Sessions Per User", - maxSessionsPerUserDesc: "Limit concurrent sessions per user. 0 = unlimited.", - mfaPolicy: "MFA Policy", - mfaPolicyDesc: "Require multi-factor authentication for users.", - mfaPolicyOptional: "Optional", - mfaPolicyAdminsOnly: "Required for admins", - mfaPolicyRequired: "Required for all users", - ssoEnforcement: "SSO Enforcement", - ssoEnforcementDesc: "Require SSO login for all non-break-glass users.", - ssoBreakGlassUsername: "Break Glass Admin Username", - ssoBreakGlassUsernameDesc: - "This admin can still log in with local credentials when SSO is enforced.", - passwordMinLength: "Minimum Password Length", - passwordMinLengthDesc: "Minimum number of characters required for passwords.", - passwordRequireUppercase: "Require Uppercase", - passwordRequireUppercaseDesc: "Require at least one uppercase letter.", - passwordRequireNumber: "Require Number", - passwordRequireNumberDesc: "Require at least one number.", - passwordRequireSpecial: "Require Special Character", - passwordRequireSpecialDesc: "Require at least one special character.", - passwordPolicyHeading: "Password Policy", - securitySettingsSaved: "Security settings saved", - securitySettingsFailed: "Failed to save security settings", + adminHeading: "إعدادات أمان المسؤول", + adminDescription: "إعدادات سياسة الأمان للمؤسسات. تنطبق على جميع المستخدمين.", + sessionIdleTimeout: "مهلة الجلسة الخاملة (بالدقائق)", + sessionIdleTimeoutDesc: "تسجيل خروج الجلسات الخاملة تلقائيًا. 0 = معطّل.", + maxSessionsPerUser: "الحد الأقصى للجلسات لكل مستخدم", + maxSessionsPerUserDesc: "تحديد عدد الجلسات المتزامنة لكل مستخدم. 0 = غير محدود.", + mfaPolicy: "سياسة MFA", + mfaPolicyDesc: "طلب المصادقة متعددة العوامل من المستخدمين.", + mfaPolicyOptional: "اختياري", + mfaPolicyAdminsOnly: "مطلوب للمسؤولين", + mfaPolicyRequired: "مطلوب لجميع المستخدمين", + ssoEnforcement: "فرض SSO", + ssoEnforcementDesc: "فرض تسجيل الدخول عبر SSO لجميع المستخدمين باستثناء حساب الطوارئ.", + ssoBreakGlassUsername: "اسم مستخدم مسؤول الطوارئ", + ssoBreakGlassUsernameDesc: "يمكن لهذا المسؤول تسجيل الدخول ببيانات اعتماد محلية عند فرض SSO.", + passwordMinLength: "الحد الأدنى لطول كلمة المرور", + passwordMinLengthDesc: "الحد الأدنى لعدد الأحرف المطلوبة لكلمات المرور.", + passwordRequireUppercase: "طلب أحرف كبيرة", + passwordRequireUppercaseDesc: "طلب حرف كبير واحد على الأقل.", + passwordRequireNumber: "طلب رقم", + passwordRequireNumberDesc: "طلب رقم واحد على الأقل.", + passwordRequireSpecial: "طلب حرف خاص", + passwordRequireSpecialDesc: "طلب حرف خاص واحد على الأقل.", + passwordPolicyHeading: "سياسة كلمة المرور", + securitySettingsSaved: "تم حفظ إعدادات الأمان", + securitySettingsFailed: "فشل حفظ إعدادات الأمان", }, people: { heading: "الأعضاء", @@ -2863,12 +2861,12 @@ export const ar: TranslationKeys = { nameRequired: "اسم الفريق مطلوب", nameTooLong: "يجب ألا يتجاوز اسم الفريق 50 حرفًا", duplicateName: "يوجد فريق بهذا الاسم بالفعل", - teamStorageQuota: "Storage Quota (MB)", - teamStorageQuotaDesc: "Maximum storage for this team in MB. Leave empty for no limit.", - teamRetentionHours: "Retention (hours)", + teamStorageQuota: "حصة التخزين (MB)", + teamStorageQuotaDesc: "الحد الأقصى للتخزين لهذا الفريق بوحدة MB. اتركه فارغًا بدون حد.", + teamRetentionHours: "الاحتفاظ (بالساعات)", teamRetentionHoursDesc: - "Processing file retention for this team. Leave empty to use global default.", - quotaSaved: "Team settings saved", + "مدة الاحتفاظ بملفات المعالجة لهذا الفريق. اتركه فارغًا لاستخدام الإعداد الافتراضي.", + quotaSaved: "تم حفظ إعدادات الفريق", }, roles: { heading: "الأدوار", @@ -2925,35 +2923,35 @@ export const ar: TranslationKeys = { daysAgo: "منذ {days} يوم", }, usage: { - heading: "Usage", - description: "Local usage statistics from jobs and file storage.", - periodLabel: "Period", - days7: "7 days", - days30: "30 days", - days90: "90 days", - jobsPerDayHeading: "Jobs per day", - topToolsHeading: "Top tools", - perUserHeading: "Per-user volume", - durationsHeading: "Duration percentiles", - noData: "No data for this period.", - dayColumn: "Day", - totalColumn: "Total", - completedColumn: "Completed", - failedColumn: "Failed", - toolColumn: "Tool", - runsColumn: "Runs", - userColumn: "User", - bytesInColumn: "Bytes in", + heading: "الاستخدام", + description: "إحصائيات الاستخدام المحلية من المهام وتخزين الملفات.", + periodLabel: "الفترة", + days7: "7 أيام", + days30: "30 يومًا", + days90: "90 يومًا", + jobsPerDayHeading: "المهام في اليوم", + topToolsHeading: "أكثر الأدوات استخدامًا", + perUserHeading: "حجم الاستخدام لكل مستخدم", + durationsHeading: "الشرائح المئوية للمدة", + noData: "لا توجد بيانات لهذه الفترة.", + dayColumn: "اليوم", + totalColumn: "الإجمالي", + completedColumn: "مكتملة", + failedColumn: "فاشلة", + toolColumn: "الأداة", + runsColumn: "التشغيلات", + userColumn: "المستخدم", + bytesInColumn: "البايتات الواردة", poolColumn: "Pool", p50Column: "p50", p95Column: "p95", - storageHeading: "Library storage", - storageFiles: "{count} files", - unknownUser: "(unknown)", - storageByTeam: "Storage by Team", - teamColumn: "Team", - storageColumn: "Storage", - usersColumn: "Users", + storageHeading: "تخزين المكتبة", + storageFiles: "{count} ملفات", + unknownUser: "(غير معروف)", + storageByTeam: "التخزين حسب الفريق", + teamColumn: "الفريق", + storageColumn: "التخزين", + usersColumn: "المستخدمون", }, apiKeys: { heading: "مفاتيح API", @@ -2996,14 +2994,15 @@ export const ar: TranslationKeys = { startupCleanupDescription: "تنظيف الملفات المؤقتة القديمة عند بدء تشغيل الخادم", }, dataRetention: { - title: "Data Retention", - fileMaxAgeHours: "Processing file retention (hours)", - fileMaxAgeHoursDesc: "How long to keep uploaded and processed files. Default: 72 hours.", - jobsRetentionDays: "Job record retention (days)", - jobsRetentionDaysDesc: "How long to keep job metadata. 0 = keep forever. Default: 30 days.", - auditRetentionDays: "Audit log retention (days)", + title: "الاحتفاظ بالبيانات", + fileMaxAgeHours: "مدة الاحتفاظ بملفات المعالجة (بالساعات)", + fileMaxAgeHoursDesc: "مدة الاحتفاظ بالملفات المرفوعة والمعالجة. الافتراضي: 72 ساعة.", + jobsRetentionDays: "مدة الاحتفاظ بسجلات المهام (بالأيام)", + jobsRetentionDaysDesc: + "مدة الاحتفاظ ببيانات المهام الوصفية. 0 = الاحتفاظ للأبد. الافتراضي: 30 يومًا.", + auditRetentionDays: "مدة الاحتفاظ بسجل التدقيق (بالأيام)", auditRetentionDaysDesc: - "How long to keep audit log entries. 0 = keep forever. Default: forever.", + "مدة الاحتفاظ بإدخالات سجل التدقيق. 0 = الاحتفاظ للأبد. الافتراضي: للأبد.", }, analytics: { heading: "تحليلات المنتج", @@ -3015,23 +3014,23 @@ export const ar: TranslationKeys = { learnMore: "معرفة المزيد", }, aiFeatures: { - title: "AI Features", + title: "ميزات AI", description: "إدارة حزم نماذج AI لمعالجة الملفات المتقدمة.", - installAll: "Install All", - diskUsage: "Disk usage:", - installed: "Installed", - notInstalled: "Not installed", - queued: "Queued", - install: "Install", - repair: "Repair", - uninstall: "Uninstall", - installing: "Installing...", - importBundle: "Import Bundle", - importDescription: "Upload a .tar.gz bundle archive exported from another installation.", - importButton: "Import from file", - importing: "Importing...", - importSuccess: "Bundle imported successfully.", - importError: "Bundle import failed: {error}", + installAll: "تثبيت الكل", + diskUsage: "استخدام القرص: {size}", + installed: "مُثبَّت", + notInstalled: "غير مُثبَّت", + queued: "في قائمة الانتظار", + install: "تثبيت", + repair: "إصلاح", + uninstall: "إزالة", + installing: "جارٍ التثبيت...", + importBundle: "استيراد حزمة", + importDescription: "ارفع أرشيف حزمة .tar.gz مُصدَّر من تثبيت آخر.", + importButton: "استيراد من ملف", + importing: "جارٍ الاستيراد...", + importSuccess: "تم استيراد الحزمة بنجاح.", + importError: "فشل استيراد الحزمة: {error}", }, about: { heading: "حول", @@ -3043,9 +3042,9 @@ export const ar: TranslationKeys = { githubLink: "مستودع GitHub", docsLink: "التوثيق", apiRefLink: "مرجع API (Swagger)", - licenseLabel: "License:", + licenseLabel: "الرخصة:", licenseDescription: - "SnapOtter is open-source software licensed under the GNU Affero General Public License v3 (AGPLv3).", + "SnapOtter برنامج مفتوح المصدر مرخّص بموجب رخصة GNU Affero العمومية الإصدار 3 (AGPLv3).", }, }, auth: { @@ -3069,18 +3068,16 @@ export const ar: TranslationKeys = { oidcUserNotAuthorized: "حسابك غير مصرح له بالوصول إلى هذا التطبيق. تواصل مع المسؤول.", oidcUserLimitReached: "تم الوصول لحد المستخدمين. تواصل مع المسؤول.", oidcGenericError: "خطأ في المصادقة. يرجى المحاولة مرة أخرى.", - samlAuthFailed: "SAML authentication failed. Please try again.", - samlUserNotAuthorized: - "Your account is not authorized to access this application. Contact your administrator.", - samlUserLimitReached: "User limit reached. Contact your administrator.", - ssoEnforcedLocalRestricted: "Local login is restricted to authorized administrators.", - mfaRequired: "Enter your authentication code", - mfaRecoveryHint: "You can also use a recovery code", - verify: "Verify", - verifying: "Verifying...", - mfaInvalidCode: "Invalid code. Please try again.", - mfaEnrollmentRequired: - "Your organization requires multi-factor authentication. Please set up MFA in your account settings.", + samlAuthFailed: "فشلت مصادقة SAML. يرجى المحاولة مرة أخرى.", + samlUserNotAuthorized: "حسابك غير مصرّح له بالوصول إلى هذا التطبيق. تواصل مع المسؤول.", + samlUserLimitReached: "تم الوصول إلى الحد الأقصى للمستخدمين. تواصل مع المسؤول.", + ssoEnforcedLocalRestricted: "تسجيل الدخول المحلي مقتصر على المسؤولين المصرّح لهم.", + mfaRequired: "أدخل رمز المصادقة", + mfaRecoveryHint: "يمكنك أيضًا استخدام رمز استرداد", + verify: "تحقق", + verifying: "جارٍ التحقق...", + mfaInvalidCode: "رمز غير صالح. يرجى المحاولة مرة أخرى.", + mfaEnrollmentRequired: "تتطلب مؤسستك المصادقة متعددة العوامل. يرجى إعداد MFA في إعدادات حسابك.", methodSaml: "SAML", passwordManagedByProvider: "يتم إدارة تغيير كلمة المرور بواسطة مزود الهوية الخاص بك.", enterUsername: "أدخل اسم المستخدم", @@ -3199,8 +3196,8 @@ export const ar: TranslationKeys = { pipelineName: "اسم Pipeline", pipelineDescription: "الوصف (اختياري)", noStepsPrompt: "أضف خطوات لبناء أتمتتك", - noStepsHeading: "No steps yet", - searchToolsPlaceholder: "Search tools...", + noStepsHeading: "لا توجد خطوات بعد", + searchToolsPlaceholder: "بحث في الأدوات...", step: "خطوة", }, nav: { @@ -3214,32 +3211,32 @@ export const ar: TranslationKeys = { grid: "شبكة", }, files: { - myFiles: "My Files", - recentTab: "Recent", - uploadTab: "Upload Files", - fileDetailsAriaLabel: "File Details", - fileDetailsHeading: "File Details", - searchPlaceholder: "Search files...", - selectedCount: "{count} selected", - fileCount: "{count} files", - fileCountSingular: "{count} file", - noFilesFound: "No files found", - selectFilePrompt: "Select a file to view details", - openFile: "Open File", - selectFile: "Select File", - openInPipeline: "Open in Pipeline", - dropFilesHere: "Drop files here", - orClickToSelect: "or click to select files", - name: "Name", - format: "Format", - size: "Size", - dimensions: "Dimensions", - version: "Version", - toolsUsed: "Tools Used", - none: "None", - delete: "Delete", + myFiles: "ملفاتي", + recentTab: "الأخيرة", + uploadTab: "رفع الملفات", + fileDetailsAriaLabel: "تفاصيل الملف", + fileDetailsHeading: "تفاصيل الملف", + searchPlaceholder: "بحث في الملفات...", + selectedCount: "{count} محدد", + fileCount: "{count} ملفات", + fileCountSingular: "{count} ملف", + noFilesFound: "لم يتم العثور على ملفات", + selectFilePrompt: "اختر ملفًا لعرض التفاصيل", + openFile: "فتح الملف", + selectFile: "اختيار الملف", + openInPipeline: "فتح في المسار", + dropFilesHere: "أسقط الملفات هنا", + orClickToSelect: "أو انقر لاختيار الملفات", + name: "الاسم", + format: "التنسيق", + size: "الحجم", + dimensions: "الأبعاد", + version: "الإصدار", + toolsUsed: "الأدوات المستخدمة", + none: "لا شيء", + delete: "حذف", pipeline: "Pipeline", - download: "Download", + download: "تنزيل", }, dropzone: { unsupportedFileType: "نوع الملف هذا غير مدعوم بهذه الأداة", @@ -3276,9 +3273,9 @@ export const ar: TranslationKeys = { retryButton: "إعادة المحاولة", queued: "في انتظار التثبيت...", enableButton: "تفعيل {name}", - repairRequired: "Repair Required", - repairDescription: "Some model files are missing or corrupted. Repair will re-download them.", - repairButton: "Repair {name}", + repairRequired: "الإصلاح مطلوب", + repairDescription: "بعض ملفات النموذج مفقودة أو تالفة. سيعيد الإصلاح تنزيلها.", + repairButton: "إصلاح {name}", lessThanMinute: "أقل من دقيقة", oneMinuteLeft: "~دقيقة واحدة متبقية", minutesLeft: "~{mins} دقائق متبقية", @@ -3391,65 +3388,65 @@ export const ar: TranslationKeys = { mobileNavSettings: "الإعدادات", }, a11y: { - skipToContent: "Skip to main content", - openSidebar: "Open sidebar", - closeSidebar: "Close sidebar", - closeSettings: "Close settings", - closeHelp: "Close help", - closeDialog: "Close dialog", - zoomIn: "Zoom in", - zoomOut: "Zoom out", - fitToView: "Fit to view", - actualSize: "Actual size", + skipToContent: "تخطي إلى المحتوى الرئيسي", + openSidebar: "فتح الشريط الجانبي", + closeSidebar: "إغلاق الشريط الجانبي", + closeSettings: "إغلاق الإعدادات", + closeHelp: "إغلاق المساعدة", + closeDialog: "إغلاق النافذة", + zoomIn: "تكبير", + zoomOut: "تصغير", + fitToView: "ملاءمة العرض", + actualSize: "الحجم الفعلي", previousImage: "الملف السابق", nextImage: "الملف التالي", imageArea: "منطقة المعاينة", imageViewer: "عارض الملفات", - fileDropZone: "File drop zone", + fileDropZone: "منطقة إسقاط الملفات", imageDropZone: "منطقة إسقاط الملفات", - beforeAfterSlider: "Before/after comparison slider", + beforeAfterSlider: "شريط مقارنة قبل/بعد", imageControls: "عناصر تحكم المعاينة", - zoomControls: "Zoom controls", - dragToReorder: "Drag to reorder", - whiteBackground: "White background", - blackBackground: "Black background", - expandPanel: "Expand panel", - collapsePanel: "Collapse panel", - swapDimensions: "Swap dimensions", - applyCrop: "Apply crop", - cancelCrop: "Cancel crop", - fontFamily: "Font family", - textColor: "Text color", - flipHorizontal: "Flip horizontal", - flipVertical: "Flip vertical", - hexColorValue: "Hex color value", - backgroundColor: "Background color", - foregroundColor: "Foreground color", - swapColors: "Swap foreground and background colors", - resetColors: "Reset to default black and white", - foregroundHex: "Foreground color hex value", - undo: "Undo", - redo: "Redo", - layers: "Layers", - addLayer: "Add layer", - deleteLayer: "Delete layer", - cancelOperation: "Cancel operation", - fill: "Fill", - fileDetails: "File details", - language: "Language", - selected: "Selected", - deleteKey: "Delete key", - editRole: "Edit role", - deleteRole: "Delete role", - notInstalled: "Not installed", - queued: "Queued for install", - installing: "Installing", - imageNOfTotal: "Image {n} of {total}", - processingComplete: "Image processed successfully", - processingFailed: "Processing failed", - settingsDialog: "Settings", - helpDialog: "Help", - navigationMenu: "Navigation", - homeLink: "SnapOtter home", + zoomControls: "أدوات التكبير", + dragToReorder: "اسحب لإعادة الترتيب", + whiteBackground: "خلفية بيضاء", + blackBackground: "خلفية سوداء", + expandPanel: "توسيع اللوحة", + collapsePanel: "طي اللوحة", + swapDimensions: "تبديل الأبعاد", + applyCrop: "تطبيق القص", + cancelCrop: "إلغاء القص", + fontFamily: "عائلة الخط", + textColor: "لون النص", + flipHorizontal: "قلب أفقي", + flipVertical: "قلب عمودي", + hexColorValue: "قيمة اللون بنظام HEX", + backgroundColor: "لون الخلفية", + foregroundColor: "لون المقدمة", + swapColors: "تبديل لون المقدمة والخلفية", + resetColors: "إعادة تعيين الألوان إلى الأسود والأبيض", + foregroundHex: "قيمة HEX للون المقدمة", + undo: "تراجع", + redo: "إعادة", + layers: "الطبقات", + addLayer: "إضافة طبقة", + deleteLayer: "حذف طبقة", + cancelOperation: "إلغاء العملية", + fill: "تعبئة", + fileDetails: "تفاصيل الملف", + language: "اللغة", + selected: "محدد", + deleteKey: "حذف المفتاح", + editRole: "تعديل الدور", + deleteRole: "حذف الدور", + notInstalled: "غير مُثبَّت", + queued: "في قائمة انتظار التثبيت", + installing: "جارٍ التثبيت", + imageNOfTotal: "الصورة {n} من {total}", + processingComplete: "تمت معالجة الصورة بنجاح", + processingFailed: "فشلت المعالجة", + settingsDialog: "الإعدادات", + helpDialog: "المساعدة", + navigationMenu: "التنقل", + homeLink: "الصفحة الرئيسية لـ SnapOtter", }, } as const;