+ >
+ );
+}
diff --git a/frontend/src/config/routes.ts b/frontend/src/config/routes.ts
index e0effb7..093a665 100644
--- a/frontend/src/config/routes.ts
+++ b/frontend/src/config/routes.ts
@@ -18,6 +18,9 @@ export const PAGE_ROUTES = [
'/contact',
'/pricing',
'/blog',
+ '/blog/:slug',
+ '/developers',
+ '/internal/admin',
] as const;
// ─── Tool routes ─────────────────────────────────────────────────
@@ -63,6 +66,23 @@ export const TOOL_ROUTES = [
'/tools/video-to-gif',
'/tools/word-counter',
'/tools/text-cleaner',
+
+ // Phase 2 – PDF Conversion
+ '/tools/pdf-to-pptx',
+ '/tools/excel-to-pdf',
+ '/tools/pptx-to-pdf',
+ '/tools/sign-pdf',
+
+ // Phase 2 – PDF Extra Tools
+ '/tools/crop-pdf',
+ '/tools/flatten-pdf',
+ '/tools/repair-pdf',
+ '/tools/pdf-metadata',
+
+ // Phase 2 – Image & Utility
+ '/tools/image-crop',
+ '/tools/image-rotate-flip',
+ '/tools/barcode-generator',
] as const;
// ─── All routes combined ─────────────────────────────────────────
diff --git a/frontend/src/config/seoData.ts b/frontend/src/config/seoData.ts
index f7fa982..d8e04ab 100644
--- a/frontend/src/config/seoData.ts
+++ b/frontend/src/config/seoData.ts
@@ -664,6 +664,221 @@ export const TOOLS_SEO: ToolSEO[] = [
{ question: 'Can I convert text to uppercase?', answer: 'Yes, you can convert text to uppercase, lowercase, or title case with a single click.' },
],
},
+
+ // ─── PHASE 2 – PDF CONVERSION ──────────────────────────────
+ {
+ i18nKey: 'pdfToPptx',
+ slug: 'pdf-to-pptx',
+ titleSuffix: 'Free Online PDF to PowerPoint Converter',
+ metaDescription: 'Convert PDF files to PowerPoint (PPTX) presentations online for free. Each PDF page becomes a slide.',
+ category: 'Convert',
+ relatedSlugs: ['pptx-to-pdf', 'pdf-to-word', 'pdf-to-excel', 'pdf-to-images'],
+ keywords: 'pdf to pptx, pdf to powerpoint, convert pdf to pptx, pdf to slides',
+ features: [
+ 'Convert each PDF page to a PowerPoint slide',
+ 'High-quality image rendering',
+ 'No software installation needed',
+ 'Files auto-deleted after 30 minutes',
+ ],
+ faqs: [
+ { question: 'How do I convert PDF to PowerPoint?', answer: 'Upload your PDF and our tool converts each page into a slide in a PPTX file. Download the result when ready.' },
+ { question: 'Is formatting preserved?', answer: 'Each page is rendered as a high-quality image on its own slide, preserving the visual layout perfectly.' },
+ ],
+ },
+ {
+ i18nKey: 'excelToPdf',
+ slug: 'excel-to-pdf',
+ titleSuffix: 'Free Online Excel to PDF Converter',
+ metaDescription: 'Convert Excel spreadsheets (XLSX, XLS) to PDF documents online for free. Preserve your table formatting.',
+ category: 'Convert',
+ relatedSlugs: ['pdf-to-excel', 'word-to-pdf', 'pptx-to-pdf'],
+ keywords: 'excel to pdf, xlsx to pdf, convert excel to pdf, spreadsheet to pdf',
+ features: [
+ 'Convert XLSX and XLS files to PDF',
+ 'Preserves table formatting and layout',
+ 'Powered by LibreOffice for accurate conversion',
+ 'Free with no signup required',
+ ],
+ faqs: [
+ { question: 'Which Excel formats are supported?', answer: 'We support both XLSX (modern) and XLS (legacy) Excel formats.' },
+ { question: 'Will my formulas be visible?', answer: 'The PDF will show the computed values, not the formulas, just like a print preview.' },
+ ],
+ },
+ {
+ i18nKey: 'pptxToPdf',
+ slug: 'pptx-to-pdf',
+ titleSuffix: 'Free Online PowerPoint to PDF Converter',
+ metaDescription: 'Convert PowerPoint presentations (PPTX, PPT) to PDF online for free. Perfect for sharing slides.',
+ category: 'Convert',
+ relatedSlugs: ['pdf-to-pptx', 'word-to-pdf', 'excel-to-pdf'],
+ keywords: 'pptx to pdf, powerpoint to pdf, convert pptx to pdf, ppt to pdf',
+ features: [
+ 'Convert PPTX and PPT files to PDF',
+ 'Preserves slide layout and graphics',
+ 'Ideal for sharing presentations',
+ 'No account needed',
+ ],
+ faqs: [
+ { question: 'Which PowerPoint formats work?', answer: 'Both PPTX and legacy PPT formats are supported.' },
+ { question: 'Are animations preserved?', answer: 'PDF is a static format, so animations are not included, but all slide content and layout are preserved.' },
+ ],
+ },
+ {
+ i18nKey: 'signPdf',
+ slug: 'sign-pdf',
+ titleSuffix: 'Free Online PDF Signer',
+ metaDescription: 'Add your signature image to any PDF document online for free. Sign PDF files without printing.',
+ category: 'PDF',
+ relatedSlugs: ['protect-pdf', 'watermark-pdf', 'pdf-editor', 'flatten-pdf'],
+ keywords: 'sign pdf, add signature to pdf, pdf signer, electronic signature pdf',
+ features: [
+ 'Upload your signature image (PNG/JPG)',
+ 'Place signature on any page',
+ 'No printing or scanning needed',
+ 'Secure — files deleted after 30 minutes',
+ ],
+ faqs: [
+ { question: 'How do I sign a PDF?', answer: 'Upload your PDF and a signature image (PNG or JPG). Choose the page and position, then download the signed PDF.' },
+ { question: 'Is this a legal electronic signature?', answer: 'This tool places a visual signature image on the PDF. For legally binding digital signatures, a certificate-based solution may be required depending on your jurisdiction.' },
+ ],
+ },
+
+ // ─── PHASE 2 – PDF EXTRA TOOLS ─────────────────────────────
+ {
+ i18nKey: 'cropPdf',
+ slug: 'crop-pdf',
+ titleSuffix: 'Free Online PDF Cropper',
+ metaDescription: 'Crop PDF pages by adjusting margins online for free. Trim unwanted whitespace from your documents.',
+ category: 'PDF',
+ relatedSlugs: ['rotate-pdf', 'split-pdf', 'pdf-editor', 'flatten-pdf'],
+ keywords: 'crop pdf, trim pdf, pdf cropper, remove pdf margins, resize pdf pages',
+ features: [
+ 'Adjust margins (top, bottom, left, right)',
+ 'Crop all or specific pages',
+ 'Remove unnecessary whitespace',
+ 'Free and no signup required',
+ ],
+ faqs: [
+ { question: 'How do I crop a PDF?', answer: 'Upload your PDF, set the margin values to trim from each side, and download the cropped version.' },
+ { question: 'Can I crop specific pages?', answer: 'Yes, you can specify which pages to crop or apply cropping to all pages at once.' },
+ ],
+ },
+ {
+ i18nKey: 'flattenPdf',
+ slug: 'flatten-pdf',
+ titleSuffix: 'Free Online PDF Flattener',
+ metaDescription: 'Flatten PDF forms and annotations online for free. Convert interactive form fields into fixed content.',
+ category: 'PDF',
+ relatedSlugs: ['protect-pdf', 'sign-pdf', 'repair-pdf', 'pdf-editor'],
+ keywords: 'flatten pdf, pdf flattener, remove form fields, flatten annotations',
+ features: [
+ 'Remove interactive form fields',
+ 'Flatten annotations into fixed content',
+ 'Prevent further editing of form data',
+ 'Ideal for archiving filled forms',
+ ],
+ faqs: [
+ { question: 'What does flattening a PDF mean?', answer: 'Flattening converts interactive elements (form fields, annotations) into static content that cannot be edited further.' },
+ { question: 'Why should I flatten a PDF?', answer: 'Flattening is useful for archiving filled forms, reducing file size, and preventing accidental changes to form data.' },
+ ],
+ },
+ {
+ i18nKey: 'repairPdf',
+ slug: 'repair-pdf',
+ titleSuffix: 'Free Online PDF Repair Tool',
+ metaDescription: 'Repair corrupted or damaged PDF files online for free. Fix broken PDFs and recover content.',
+ category: 'PDF',
+ relatedSlugs: ['flatten-pdf', 'compress-pdf', 'unlock-pdf', 'pdf-metadata'],
+ keywords: 'repair pdf, fix pdf, broken pdf, corrupted pdf, pdf recovery',
+ features: [
+ 'Fix corrupted PDF structures',
+ 'Recover readable pages from damaged files',
+ 'Re-write clean PDF output',
+ 'Free with no file size limits',
+ ],
+ faqs: [
+ { question: 'Can this fix any broken PDF?', answer: 'Our tool attempts to recover as many pages as possible. Severely corrupted files may only be partially recoverable.' },
+ { question: 'Is my data safe?', answer: 'Yes, all files are processed securely and deleted within 30 minutes.' },
+ ],
+ },
+ {
+ i18nKey: 'pdfMetadata',
+ slug: 'pdf-metadata',
+ titleSuffix: 'Free Online PDF Metadata Editor',
+ metaDescription: 'View and edit PDF metadata (title, author, subject, keywords) online for free.',
+ category: 'PDF',
+ relatedSlugs: ['pdf-editor', 'repair-pdf', 'protect-pdf', 'flatten-pdf'],
+ keywords: 'pdf metadata, edit pdf properties, pdf title, pdf author, pdf info editor',
+ features: [
+ 'Edit title, author, subject, keywords',
+ 'Set custom creator information',
+ 'View existing metadata before editing',
+ 'Free online tool — no installation',
+ ],
+ faqs: [
+ { question: 'What is PDF metadata?', answer: 'PDF metadata includes properties like title, author, subject, and keywords embedded in the document. Search engines and document managers use this information.' },
+ { question: 'Can I remove metadata?', answer: 'Yes, leave fields blank to remove existing metadata values.' },
+ ],
+ },
+
+ // ─── PHASE 2 – IMAGE & UTILITY ─────────────────────────────
+ {
+ i18nKey: 'imageCrop',
+ slug: 'image-crop',
+ titleSuffix: 'Free Online Image Cropper',
+ metaDescription: 'Crop images online for free. Specify exact pixel coordinates to trim your photos and graphics.',
+ category: 'Image',
+ relatedSlugs: ['image-resize', 'image-rotate-flip', 'compress-image', 'image-converter'],
+ keywords: 'crop image, image cropper, trim image, cut image, photo crop',
+ features: [
+ 'Specify exact crop coordinates in pixels',
+ 'Supports PNG, JPG, and WebP',
+ 'High-quality output',
+ 'Free — no watermarks added',
+ ],
+ faqs: [
+ { question: 'How do I crop an image?', answer: 'Upload your image, enter the left, top, right, and bottom pixel coordinates for the crop area, then download the result.' },
+ { question: 'What formats are supported?', answer: 'PNG, JPG/JPEG, and WebP images are supported.' },
+ ],
+ },
+ {
+ i18nKey: 'imageRotateFlip',
+ slug: 'image-rotate-flip',
+ titleSuffix: 'Free Online Image Rotate & Flip Tool',
+ metaDescription: 'Rotate and flip images online for free. Rotate by 90°, 180°, or 270° and flip horizontally or vertically.',
+ category: 'Image',
+ relatedSlugs: ['image-crop', 'image-resize', 'compress-image', 'image-converter'],
+ keywords: 'rotate image, flip image, image rotator, mirror image, image orientation',
+ features: [
+ 'Rotate images by 90°, 180°, or 270°',
+ 'Flip horizontally or vertically',
+ 'Combine rotation and flip in one step',
+ 'Supports PNG, JPG, and WebP',
+ ],
+ faqs: [
+ { question: 'Can I rotate and flip at the same time?', answer: 'Yes, you can combine rotation and flip operations in a single step.' },
+ { question: 'Does rotating affect quality?', answer: 'No, rotation is lossless for PNG. For JPG, the quality is preserved as closely as possible.' },
+ ],
+ },
+ {
+ i18nKey: 'barcode',
+ slug: 'barcode-generator',
+ titleSuffix: 'Free Online Barcode Generator',
+ metaDescription: 'Generate barcodes online for free. Supports Code128, Code39, EAN-13, UPC-A, ISBN, and more formats.',
+ category: 'Utility',
+ relatedSlugs: ['qr-code'],
+ keywords: 'barcode generator, create barcode, code128, ean13, upc barcode, free barcode',
+ features: [
+ 'Support for Code128, Code39, EAN-13, UPC-A, ISBN and more',
+ 'Output as PNG or SVG',
+ 'Instant generation with preview',
+ 'Free with no limits',
+ ],
+ faqs: [
+ { question: 'What barcode formats are supported?', answer: 'We support Code128, Code39, EAN-13, EAN-8, UPC-A, ISBN-13, ISBN-10, ISSN, and PZN barcode formats.' },
+ { question: 'What is the difference between a barcode and a QR code?', answer: 'Barcodes are one-dimensional (linear) and hold less data. QR codes are two-dimensional and can store more information. Use both from our tools.' },
+ ],
+ },
];
/** Look up a tool's SEO data by slug */
diff --git a/frontend/src/content/blogArticles.ts b/frontend/src/content/blogArticles.ts
new file mode 100644
index 0000000..3d6ccf2
--- /dev/null
+++ b/frontend/src/content/blogArticles.ts
@@ -0,0 +1,533 @@
+export type BlogLocale = 'en' | 'ar' | 'fr';
+
+interface LocalizedText {
+ en: string;
+ ar: string;
+ fr: string;
+}
+
+interface BlogArticleSection {
+ heading: LocalizedText;
+ paragraphs: LocalizedText[];
+ bullets?: LocalizedText[];
+}
+
+export interface BlogArticle {
+ slug: string;
+ category: 'PDF' | 'Image' | 'AI';
+ publishedAt: string;
+ readingMinutes: number;
+ toolSlugs: string[];
+ title: LocalizedText;
+ excerpt: LocalizedText;
+ seoDescription: LocalizedText;
+ keyTakeaways: LocalizedText[];
+ sections: BlogArticleSection[];
+}
+
+export interface LocalizedBlogArticle {
+ slug: string;
+ category: BlogArticle['category'];
+ publishedAt: string;
+ readingMinutes: number;
+ toolSlugs: string[];
+ title: string;
+ excerpt: string;
+ seoDescription: string;
+ keyTakeaways: string[];
+ sections: Array<{
+ heading: string;
+ paragraphs: string[];
+ bullets: string[];
+ }>;
+}
+
+export const BLOG_ARTICLES: BlogArticle[] = [
+ {
+ slug: 'how-to-compress-pdf-online',
+ category: 'PDF',
+ publishedAt: '2025-01-15',
+ readingMinutes: 4,
+ toolSlugs: ['compress-pdf', 'merge-pdf', 'pdf-to-word'],
+ title: {
+ en: 'How to Compress PDFs Without Losing Quality',
+ ar: 'كيف تضغط ملفات PDF دون فقدان الجودة',
+ fr: 'Comment compresser des PDF sans perte de qualité',
+ },
+ excerpt: {
+ en: 'Learn the best techniques to reduce PDF file size while maintaining document quality for sharing and uploading.',
+ ar: 'تعلّم أفضل الطرق لتقليل حجم ملفات PDF مع الحفاظ على جودة المستند للمشاركة والرفع.',
+ fr: 'Découvrez les meilleures techniques pour réduire la taille des PDF tout en conservant la qualité du document.',
+ },
+ seoDescription: {
+ en: 'A practical guide to reducing PDF size without ruining text clarity, image fidelity, or upload readiness.',
+ ar: 'دليل عملي لتقليل حجم PDF بدون الإضرار بوضوح النص أو جودة الصور أو جاهزية الرفع.',
+ fr: 'Guide pratique pour réduire la taille d’un PDF sans dégrader la netteté du texte ni la qualité des images.',
+ },
+ keyTakeaways: [
+ {
+ en: 'Start with balanced compression before trying aggressive settings.',
+ ar: 'ابدأ دائماً بضغط متوازن قبل تجربة الإعدادات القوية.',
+ fr: 'Commencez par une compression équilibrée avant les réglages agressifs.',
+ },
+ {
+ en: 'Image-heavy PDFs shrink the most, while text-heavy files often need less compression.',
+ ar: 'ملفات PDF الغنية بالصور تنخفض أكثر، بينما الملفات النصية تحتاج عادةً ضغطاً أقل.',
+ fr: 'Les PDF riches en images gagnent le plus, alors que les fichiers textuels nécessitent souvent moins de compression.',
+ },
+ {
+ en: 'Review the final file before sending it to clients or uploading it to portals.',
+ ar: 'راجع الملف النهائي قبل إرساله للعملاء أو رفعه إلى أي بوابة.',
+ fr: 'Vérifiez toujours le fichier final avant de l’envoyer à un client ou de le téléverser.',
+ },
+ ],
+ sections: [
+ {
+ heading: {
+ en: 'Why PDFs become too large',
+ ar: 'لماذا تصبح ملفات PDF كبيرة جداً',
+ fr: 'Pourquoi certains PDF deviennent trop lourds',
+ },
+ paragraphs: [
+ {
+ en: 'Most oversized PDFs are caused by embedded images, repeated scans, or exported documents that keep unnecessary metadata. The file may look simple, but it can still contain large assets behind the scenes.',
+ ar: 'معظم ملفات PDF الكبيرة يكون سببها الصور المضمّنة، أو المسح الضوئي المتكرر، أو التصدير من برامج تحتفظ ببيانات وصفية غير ضرورية. قد يبدو الملف بسيطاً لكنه يحمل عناصر ثقيلة في الخلفية.',
+ fr: 'La plupart des PDF volumineux sont dus aux images intégrées, aux scans répétés ou aux exports qui conservent trop de métadonnées. Le document peut sembler simple tout en contenant des éléments lourds en arrière-plan.',
+ },
+ {
+ en: 'If your goal is email delivery, portal upload, or faster downloads, the right compression level matters more than chasing the smallest possible file.',
+ ar: 'إذا كان هدفك هو الإرسال بالبريد أو الرفع إلى بوابة أو تسريع التنزيل، فإن اختيار مستوى الضغط المناسب أهم من مطاردة أصغر حجم ممكن.',
+ fr: 'Si votre objectif est l’envoi par e-mail, le dépôt sur un portail ou un téléchargement plus rapide, le bon niveau de compression compte davantage que la taille minimale absolue.',
+ },
+ ],
+ },
+ {
+ heading: {
+ en: 'A safer compression workflow',
+ ar: 'سير عمل أكثر أماناً للضغط',
+ fr: 'Une méthode de compression plus sûre',
+ },
+ paragraphs: [
+ {
+ en: 'Use balanced compression first, inspect pages with small text or charts, then decide whether you need a stronger setting. This prevents quality regressions that are hard to notice until a document reaches a customer.',
+ ar: 'استخدم الضغط المتوازن أولاً، ثم افحص الصفحات التي تحتوي على نص صغير أو مخططات، وبعدها قرر إن كنت بحاجة إلى ضغط أقوى. بهذه الطريقة تتجنب تدهور الجودة الذي قد لا تلاحظه إلا بعد وصول الملف إلى العميل.',
+ fr: 'Appliquez d’abord une compression équilibrée, vérifiez les pages contenant du petit texte ou des graphiques, puis décidez si un niveau plus fort est nécessaire. Cela évite les régressions de qualité détectées trop tard.',
+ },
+ ],
+ bullets: [
+ {
+ en: 'Compress before merging large reports to keep the final package smaller.',
+ ar: 'اضغط الملفات قبل دمج التقارير الكبيرة للحفاظ على حجم الناتج النهائي أصغر.',
+ fr: 'Compressez avant de fusionner de gros rapports afin de réduire le poids final.',
+ },
+ {
+ en: 'Keep an original copy when handling signed or compliance documents.',
+ ar: 'احتفظ بنسخة أصلية عند التعامل مع مستندات موقعة أو مرتبطة بالامتثال.',
+ fr: 'Conservez une copie originale pour les documents signés ou réglementaires.',
+ },
+ {
+ en: 'If a portal still rejects the file, remove metadata after compression.',
+ ar: 'إذا استمرت البوابة في رفض الملف، فاحذف البيانات الوصفية بعد الضغط.',
+ fr: 'Si le portail refuse encore le fichier, supprimez les métadonnées après compression.',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ slug: 'convert-images-without-losing-quality',
+ category: 'Image',
+ publishedAt: '2025-01-10',
+ readingMinutes: 4,
+ toolSlugs: ['image-converter', 'image-resize', 'compress-image'],
+ title: {
+ en: 'Convert Images Between Formats Losslessly',
+ ar: 'تحويل الصور بين الصيغ دون فقدان',
+ fr: 'Convertir des images entre formats sans perte',
+ },
+ excerpt: {
+ en: 'A complete guide to converting between PNG, JPG, WebP and other image formats while preserving quality.',
+ ar: 'دليل كامل للتحويل بين PNG وJPG وWebP وغيرها مع الحفاظ على الجودة.',
+ fr: 'Guide complet pour convertir entre PNG, JPG, WebP et d’autres formats tout en préservant la qualité.',
+ },
+ seoDescription: {
+ en: 'Choose the right image format for screenshots, product photos, transparent graphics, and web performance.',
+ ar: 'اختر صيغة الصورة المناسبة للقطات الشاشة وصور المنتجات والعناصر الشفافة وأداء الويب.',
+ fr: 'Choisissez le bon format pour les captures d’écran, les photos produit, les graphismes transparents et la performance web.',
+ },
+ keyTakeaways: [
+ {
+ en: 'PNG is best for transparency and interface graphics.',
+ ar: 'PNG هو الأفضل للشفافية ورسومات الواجهات.',
+ fr: 'Le PNG reste idéal pour la transparence et les interfaces.',
+ },
+ {
+ en: 'JPG is efficient for photos, while WebP often gives the best web balance.',
+ ar: 'JPG مناسب للصور الفوتوغرافية، بينما WebP يقدّم غالباً أفضل توازن للويب.',
+ fr: 'Le JPG convient aux photos, tandis que le WebP offre souvent le meilleur compromis pour le web.',
+ },
+ {
+ en: 'Resize before compressing if you need smaller files for publishing.',
+ ar: 'غيّر الأبعاد قبل الضغط إذا كنت تحتاج ملفات أصغر للنشر.',
+ fr: 'Redimensionnez avant de compresser si vous visez des fichiers plus légers pour la publication.',
+ },
+ ],
+ sections: [
+ {
+ heading: {
+ en: 'Pick the format for the job',
+ ar: 'اختر الصيغة بحسب المهمة',
+ fr: 'Choisir le format selon l’usage',
+ },
+ paragraphs: [
+ {
+ en: 'Image conversion is not only about compatibility. It affects loading speed, transparency support, print quality, and how clean the asset looks after repeated editing.',
+ ar: 'تحويل الصور لا يتعلق بالتوافق فقط. بل يؤثر في سرعة التحميل، ودعم الشفافية، وجودة الطباعة، ومدى نظافة الملف بعد التعديل المتكرر.',
+ fr: 'La conversion d’image ne concerne pas seulement la compatibilité. Elle influence la vitesse de chargement, la transparence, la qualité d’impression et la tenue de l’image après plusieurs éditions.',
+ },
+ {
+ en: 'Screenshots and diagrams usually benefit from PNG or WebP, while camera photos often work better as JPG or WebP with moderate compression.',
+ ar: 'لقطات الشاشة والرسومات تستفيد غالباً من PNG أو WebP، بينما صور الكاميرا تعمل عادةً بشكل أفضل مع JPG أو WebP بضغط متوسط.',
+ fr: 'Les captures d’écran et schémas profitent souvent du PNG ou du WebP, alors que les photos d’appareil se prêtent mieux au JPG ou au WebP avec une compression modérée.',
+ },
+ ],
+ },
+ {
+ heading: {
+ en: 'Avoid hidden quality loss',
+ ar: 'تجنب فقدان الجودة غير الملحوظ',
+ fr: 'Éviter les pertes de qualité invisibles',
+ },
+ paragraphs: [
+ {
+ en: 'Repeated conversions between lossy formats degrade sharp edges and text overlays. Keep one high-quality master file, then export the version you need for delivery.',
+ ar: 'التحويل المتكرر بين الصيغ الضائعة يضعف الحواف الحادة والنصوص فوق الصور. احتفظ بنسخة رئيسية عالية الجودة ثم صدّر النسخة المناسبة للتسليم.',
+ fr: 'Les conversions répétées entre formats avec perte dégradent les bords nets et les textes incrustés. Conservez un original de qualité, puis exportez uniquement la version de diffusion.',
+ },
+ ],
+ bullets: [
+ {
+ en: 'Resize hero images before uploading them to your website.',
+ ar: 'غيّر أبعاد الصور الرئيسية قبل رفعها إلى موقعك.',
+ fr: 'Redimensionnez les visuels principaux avant de les envoyer sur votre site.',
+ },
+ {
+ en: 'Use transparent PNG or WebP for logos and overlays.',
+ ar: 'استخدم PNG أو WebP شفافاً للشعارات والعناصر المركبة.',
+ fr: 'Utilisez du PNG ou du WebP transparent pour les logos et surimpressions.',
+ },
+ {
+ en: 'Choose compression after you confirm the final dimensions.',
+ ar: 'اختر الضغط بعد التأكد من الأبعاد النهائية للصورة.',
+ fr: 'Choisissez la compression après validation des dimensions finales.',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ slug: 'ocr-extract-text-from-images',
+ category: 'AI',
+ publishedAt: '2025-01-05',
+ readingMinutes: 5,
+ toolSlugs: ['ocr', 'pdf-to-word', 'extract-tables'],
+ title: {
+ en: 'Extract Text from Scanned Documents with OCR',
+ ar: 'استخراج النص من المستندات الممسوحة بـ OCR',
+ fr: 'Extraire du texte de documents numérisés avec l’OCR',
+ },
+ excerpt: {
+ en: 'Turn scanned PDFs and images into editable, searchable text using our AI-powered OCR technology.',
+ ar: 'حوّل ملفات PDF الممسوحة والصور إلى نص قابل للتعديل والبحث باستخدام OCR المدعوم بالذكاء الاصطناعي.',
+ fr: 'Transformez les PDF numérisés et les images en texte modifiable et recherchable grâce à l’OCR.',
+ },
+ seoDescription: {
+ en: 'Improve OCR accuracy with better scans, language selection, and post-processing workflows for editable output.',
+ ar: 'ارفع دقة OCR من خلال تحسين المسح الضوئي واختيار اللغة وسير العمل اللاحق للحصول على نص قابل للتحرير.',
+ fr: 'Améliorez la précision OCR grâce à de meilleurs scans, au bon choix de langue et à un workflow de correction.',
+ },
+ keyTakeaways: [
+ {
+ en: 'Clean scans and the right OCR language dramatically improve accuracy.',
+ ar: 'المسح النظيف واختيار لغة OCR الصحيحة يرفعان الدقة بشكل كبير.',
+ fr: 'Un scan propre et la bonne langue OCR améliorent fortement la précision.',
+ },
+ {
+ en: 'OCR is ideal for searchable archives, not perfect page design recreation.',
+ ar: 'OCR مناسب للأرشفة القابلة للبحث، وليس لإعادة تصميم الصفحة بدقة كاملة.',
+ fr: 'L’OCR sert surtout à rendre les archives recherchables, pas à reproduire parfaitement la mise en page.',
+ },
+ {
+ en: 'Use table extraction or Word conversion after OCR when structure matters.',
+ ar: 'استخدم استخراج الجداول أو التحويل إلى Word بعد OCR عندما تكون البنية مهمة.',
+ fr: 'Utilisez ensuite l’extraction de tableaux ou la conversion Word si la structure compte.',
+ },
+ ],
+ sections: [
+ {
+ heading: {
+ en: 'What OCR is good at',
+ ar: 'ما الذي يتقنه OCR',
+ fr: 'Ce que l’OCR fait bien',
+ },
+ paragraphs: [
+ {
+ en: 'OCR turns image-based text into selectable text that you can search, copy, and reuse. It is especially useful for scanned contracts, invoices, receipts, and photographed notes.',
+ ar: 'يقوم OCR بتحويل النص الموجود داخل الصور إلى نص يمكن تحديده والبحث فيه ونسخه وإعادة استخدامه. وهو مفيد خصوصاً للعقود الممسوحة والفواتير والإيصالات والملاحظات المصوّرة.',
+ fr: 'L’OCR transforme le texte présent dans une image en texte sélectionnable, copiable et recherchable. Il est particulièrement utile pour les contrats scannés, factures, reçus et notes photographiées.',
+ },
+ {
+ en: 'It works best when text is high contrast, upright, and captured at a readable resolution. Blurry or skewed pages still work, but you should expect more cleanup afterward.',
+ ar: 'يعمل بأفضل شكل عندما يكون النص واضح التباين ومستقيماً وبدقة مناسبة. يمكنه التعامل مع الصفحات المشوشة أو المائلة، لكنك ستحتاج عادةً إلى تنظيف أكبر بعد الاستخراج.',
+ fr: 'Il fonctionne mieux quand le texte est net, bien contrasté, droit et d’une résolution suffisante. Les pages floues ou inclinées restent possibles, mais demandent plus de corrections ensuite.',
+ },
+ ],
+ },
+ {
+ heading: {
+ en: 'How to improve the final output',
+ ar: 'كيف تحسن النتيجة النهائية',
+ fr: 'Comment améliorer le résultat final',
+ },
+ paragraphs: [
+ {
+ en: 'Before running OCR, crop noisy margins and rotate crooked images. After extraction, move structured content into Word or a spreadsheet if you need real editing rather than plain text.',
+ ar: 'قبل تشغيل OCR، قص الحواف المزعجة ودوّر الصور المائلة. وبعد الاستخراج، انقل المحتوى المنظم إلى Word أو جدول إذا كنت تحتاج تحريراً فعلياً وليس نصاً مجرداً فقط.',
+ fr: 'Avant de lancer l’OCR, rognez les marges inutiles et redressez les images. Après extraction, envoyez le contenu structuré vers Word ou un tableur si vous avez besoin d’édition réelle.',
+ },
+ ],
+ bullets: [
+ {
+ en: 'Use the exact OCR language whenever possible.',
+ ar: 'استخدم لغة OCR الدقيقة كلما أمكن.',
+ fr: 'Choisissez la langue OCR exacte dès que possible.',
+ },
+ {
+ en: 'Split mixed documents when only a few pages need OCR.',
+ ar: 'قسّم المستندات المختلطة عندما تكون بضع صفحات فقط بحاجة إلى OCR.',
+ fr: 'Découpez les documents mixtes si seules quelques pages nécessitent l’OCR.',
+ },
+ {
+ en: 'Review numbers and names manually before final delivery.',
+ ar: 'راجع الأرقام والأسماء يدوياً قبل التسليم النهائي.',
+ fr: 'Vérifiez manuellement les nombres et noms avant livraison.',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ slug: 'merge-split-pdf-files',
+ category: 'PDF',
+ publishedAt: '2024-12-28',
+ readingMinutes: 4,
+ toolSlugs: ['merge-pdf', 'split-pdf', 'extract-pages'],
+ title: {
+ en: 'Master Merging and Splitting PDF Files',
+ ar: 'إتقان دمج وتقسيم ملفات PDF',
+ fr: 'Maîtriser la fusion et la division de fichiers PDF',
+ },
+ excerpt: {
+ en: 'Step-by-step guide to combining multiple PDFs into one or splitting a large PDF into separate files.',
+ ar: 'دليل خطوة بخطوة لدمج عدة ملفات PDF في ملف واحد أو تقسيم ملف كبير إلى ملفات منفصلة.',
+ fr: 'Guide pas à pas pour combiner plusieurs PDF en un seul ou découper un gros document en plusieurs fichiers.',
+ },
+ seoDescription: {
+ en: 'Organize reports, contracts, and attachments faster by choosing the right merge, split, or extract workflow.',
+ ar: 'نظّم التقارير والعقود والمرفقات بسرعة أكبر باختيار سير العمل المناسب للدمج أو التقسيم أو الاستخراج.',
+ fr: 'Organisez plus vite rapports, contrats et pièces jointes en choisissant le bon workflow de fusion, division ou extraction.',
+ },
+ keyTakeaways: [
+ {
+ en: 'Merge for delivery packages, split for review and routing.',
+ ar: 'استخدم الدمج لحزم التسليم، والتقسيم للمراجعة والتوزيع.',
+ fr: 'Fusionnez pour livrer un dossier complet, découpez pour relire ou distribuer.',
+ },
+ {
+ en: 'Extract only the pages you need instead of duplicating large files.',
+ ar: 'استخرج الصفحات المطلوبة فقط بدلاً من تكرار الملفات الكبيرة كاملة.',
+ fr: 'Extrayez uniquement les pages utiles plutôt que de dupliquer de gros fichiers.',
+ },
+ {
+ en: 'Reorder pages before final export when document sequence matters.',
+ ar: 'أعد ترتيب الصفحات قبل التصدير النهائي عندما يكون التسلسل مهماً.',
+ fr: 'Réorganisez les pages avant export si l’ordre du document est critique.',
+ },
+ ],
+ sections: [
+ {
+ heading: {
+ en: 'When to merge and when to split',
+ ar: 'متى تدمج ومتى تقسّم',
+ fr: 'Quand fusionner et quand séparer',
+ },
+ paragraphs: [
+ {
+ en: 'Merging is useful when you need one clean delivery package for a client, regulator, or internal archive. Splitting helps when each stakeholder only needs specific pages or sections.',
+ ar: 'الدمج مفيد عندما تحتاج حزمة تسليم نظيفة واحدة للعميل أو للجهة التنظيمية أو للأرشفة الداخلية. أما التقسيم فيفيد عندما يحتاج كل طرف صفحات أو أقساماً محددة فقط.',
+ fr: 'La fusion est utile pour produire un dossier unique à transmettre à un client, un régulateur ou un archivage interne. La division aide quand chaque destinataire n’a besoin que de certaines pages.',
+ },
+ {
+ en: 'A good workflow often combines both: extract or split first, then merge only the pages that belong together.',
+ ar: 'وغالباً ما يجمع سير العمل الجيد بين الاثنين: استخرج أو قسّم أولاً، ثم ادمج الصفحات التي يجب أن تبقى معاً فقط.',
+ fr: 'Le meilleur workflow combine souvent les deux: extraire ou découper d’abord, puis fusionner uniquement les pages réellement liées.',
+ },
+ ],
+ },
+ {
+ heading: {
+ en: 'Reduce mistakes in document assembly',
+ ar: 'قلّل أخطاء تجميع المستندات',
+ fr: 'Réduire les erreurs d’assemblage',
+ },
+ paragraphs: [
+ {
+ en: 'Before sending a compiled PDF, verify page order, duplicate pages, and section breaks. A fast visual scan after assembly is cheaper than reissuing the wrong document later.',
+ ar: 'قبل إرسال PDF مجمّع، تأكد من ترتيب الصفحات وتكرارها وفواصل الأقسام. المراجعة البصرية السريعة بعد التجميع أقل كلفة بكثير من إعادة إصدار المستند لاحقاً بشكل خاطئ.',
+ fr: 'Avant d’envoyer un PDF assemblé, vérifiez l’ordre des pages, les doublons et les ruptures de section. Un contrôle visuel rapide coûte moins cher qu’une réémission ultérieure.',
+ },
+ ],
+ bullets: [
+ {
+ en: 'Name output files by audience or purpose.',
+ ar: 'سمِّ الملفات الناتجة وفق الجمهور أو الغرض.',
+ fr: 'Nommez les fichiers selon le destinataire ou l’usage.',
+ },
+ {
+ en: 'Compress final bundles only after page order is locked.',
+ ar: 'اضغط الحزم النهائية فقط بعد تثبيت ترتيب الصفحات.',
+ fr: 'Compressez le lot final uniquement une fois l’ordre figé.',
+ },
+ {
+ en: 'Use page extraction when only annexes or signatures are required.',
+ ar: 'استخدم استخراج الصفحات عندما تحتاج فقط الملاحق أو صفحات التوقيع.',
+ fr: 'Utilisez l’extraction si vous n’avez besoin que des annexes ou signatures.',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ slug: 'ai-chat-with-pdf-documents',
+ category: 'AI',
+ publishedAt: '2024-12-20',
+ readingMinutes: 5,
+ toolSlugs: ['chat-pdf', 'summarize-pdf', 'translate-pdf'],
+ title: {
+ en: 'Chat with Your PDF Documents Using AI',
+ ar: 'تحدث مع مستندات PDF باستخدام الذكاء الاصطناعي',
+ fr: 'Discutez avec vos documents PDF grâce à l’IA',
+ },
+ excerpt: {
+ en: 'Discover how AI can help you ask questions and get instant answers from any PDF document.',
+ ar: 'اكتشف كيف يساعدك الذكاء الاصطناعي على طرح الأسئلة والحصول على إجابات فورية من أي مستند PDF.',
+ fr: 'Découvrez comment l’IA peut vous aider à poser des questions et obtenir des réponses instantanées à partir de n’importe quel PDF.',
+ },
+ seoDescription: {
+ en: 'Use AI chat, summaries, and translation together to move from document reading to faster decisions.',
+ ar: 'استخدم المحادثة والملخصات والترجمة بالذكاء الاصطناعي معاً للانتقال من القراءة إلى القرار بشكل أسرع.',
+ fr: 'Combinez chat IA, résumés et traduction pour passer plus vite de la lecture à la décision.',
+ },
+ keyTakeaways: [
+ {
+ en: 'AI chat is strongest when you ask narrow, contextual questions.',
+ ar: 'المحادثة الذكية تكون أقوى عندما تطرح أسئلة ضيقة ومحددة بالسياق.',
+ fr: 'Le chat IA est plus performant avec des questions précises et contextualisées.',
+ },
+ {
+ en: 'Summaries help you orient quickly before deeper analysis.',
+ ar: 'الملخصات تساعدك على التوجيه السريع قبل التحليل المتعمق.',
+ fr: 'Les résumés aident à s’orienter rapidement avant une analyse plus profonde.',
+ },
+ {
+ en: 'Translation expands access, but the original document should still be reviewed for critical decisions.',
+ ar: 'الترجمة توسّع الوصول، لكن يجب مراجعة المستند الأصلي عند اتخاذ قرارات حساسة.',
+ fr: 'La traduction élargit l’accès, mais le document source doit être relu pour les décisions critiques.',
+ },
+ ],
+ sections: [
+ {
+ heading: {
+ en: 'Turn long documents into answers',
+ ar: 'حوّل المستندات الطويلة إلى إجابات',
+ fr: 'Transformer de longs documents en réponses',
+ },
+ paragraphs: [
+ {
+ en: 'AI chat becomes useful when documents are long, repetitive, or packed with details. Instead of scrolling for one clause or number, you can ask targeted questions and move faster.',
+ ar: 'تصبح محادثة الذكاء الاصطناعي مفيدة عندما تكون المستندات طويلة أو متكررة أو مليئة بالتفاصيل. بدلاً من التمرير بحثاً عن بند أو رقم واحد، يمكنك طرح أسئلة محددة والتحرك بسرعة أكبر.',
+ fr: 'Le chat IA devient particulièrement utile lorsque les documents sont longs, répétitifs ou très denses. Plutôt que de parcourir chaque page, vous posez une question ciblée et avancez plus vite.',
+ },
+ {
+ en: 'This works especially well for policy manuals, proposals, research PDFs, and contract drafts that need quick understanding before deeper review.',
+ ar: 'ويناسب ذلك بشكل خاص أدلة السياسات، والعروض، والأبحاث، ومسودات العقود التي تحتاج إلى فهم سريع قبل المراجعة المتعمقة.',
+ fr: 'Cela fonctionne particulièrement bien pour les manuels, propositions, recherches PDF et projets de contrat nécessitant une compréhension rapide avant relecture détaillée.',
+ },
+ ],
+ },
+ {
+ heading: {
+ en: 'Build a practical AI workflow',
+ ar: 'ابنِ سير عمل عملياً مع الذكاء الاصطناعي',
+ fr: 'Construire un workflow IA pratique',
+ },
+ paragraphs: [
+ {
+ en: 'Start with a summary, ask follow-up questions about the exact section you care about, then translate or export only what needs to be shared. This keeps the workflow focused and auditable.',
+ ar: 'ابدأ بملخص، ثم اطرح أسئلة متابعة حول القسم الذي يهمك فعلاً، ثم ترجم أو صدّر فقط ما يلزم مشاركته. هكذا يبقى سير العمل مركزاً وقابلاً للمراجعة.',
+ fr: 'Commencez par un résumé, posez ensuite des questions ciblées sur la section utile, puis traduisez ou partagez seulement ce qui doit l’être. Le flux de travail reste ainsi concentré et contrôlable.',
+ },
+ ],
+ bullets: [
+ {
+ en: 'Ask for page references when you need validation.',
+ ar: 'اطلب الإشارة إلى الصفحات عندما تحتاج إلى تحقق إضافي.',
+ fr: 'Demandez des références de pages lorsque vous avez besoin de validation.',
+ },
+ {
+ en: 'Use summaries before meetings or handoffs.',
+ ar: 'استخدم الملخصات قبل الاجتماعات أو التسليمات.',
+ fr: 'Utilisez les résumés avant une réunion ou un transfert.',
+ },
+ {
+ en: 'Keep human review in the loop for legal or financial material.',
+ ar: 'أبقِ المراجعة البشرية حاضرة مع المواد القانونية أو المالية.',
+ fr: 'Gardez toujours une relecture humaine pour les contenus juridiques ou financiers.',
+ },
+ ],
+ },
+ ],
+ },
+];
+
+export function normalizeBlogLocale(language: string): BlogLocale {
+ const baseLanguage = language.split('-')[0] as BlogLocale;
+ return baseLanguage === 'ar' || baseLanguage === 'fr' ? baseLanguage : 'en';
+}
+
+function localizeText(text: LocalizedText, locale: BlogLocale): string {
+ return text[locale] || text.en;
+}
+
+export function getLocalizedBlogArticle(article: BlogArticle, locale: BlogLocale): LocalizedBlogArticle {
+ return {
+ slug: article.slug,
+ category: article.category,
+ publishedAt: article.publishedAt,
+ readingMinutes: article.readingMinutes,
+ toolSlugs: article.toolSlugs,
+ title: localizeText(article.title, locale),
+ excerpt: localizeText(article.excerpt, locale),
+ seoDescription: localizeText(article.seoDescription, locale),
+ keyTakeaways: article.keyTakeaways.map((item) => localizeText(item, locale)),
+ sections: article.sections.map((section) => ({
+ heading: localizeText(section.heading, locale),
+ paragraphs: section.paragraphs.map((paragraph) => localizeText(paragraph, locale)),
+ bullets: (section.bullets || []).map((bullet) => localizeText(bullet, locale)),
+ })),
+ };
+}
+
+export function getBlogArticleBySlug(slug: string): BlogArticle | undefined {
+ return BLOG_ARTICLES.find((article) => article.slug === slug);
+}
\ No newline at end of file
diff --git a/frontend/src/i18n/ar.json b/frontend/src/i18n/ar.json
index ca3093a..c4c22c6 100644
--- a/frontend/src/i18n/ar.json
+++ b/frontend/src/i18n/ar.json
@@ -17,6 +17,8 @@
"privacy": "سياسة الخصوصية",
"terms": "شروط الاستخدام",
"language": "اللغة",
+ "search": "بحث",
+ "clear": "مسح",
"allTools": "كل الأدوات",
"account": "الحساب",
"signIn": "تسجيل الدخول",
@@ -27,6 +29,7 @@
"contact": "اتصل بنا",
"pricing": "الأسعار",
"blog": "المدونة",
+ "developers": "للمطورين",
"send": "إرسال",
"subject": "الموضوع",
"message": "الرسالة",
@@ -121,6 +124,8 @@
"editNowTooltip": "افتح أداة تحسين PDF السريعة لإنشاء نسخة نظيفة قابلة للتنزيل",
"suggestedTools": "الأدوات المقترحة لملفك",
"suggestedToolsDesc": "بعد رفع الملف سنعرض الأدوات المتوافقة تلقائيًا: تحرير نص، تمييز، دمج/تقسيم، ضغط، تحويل إلى Word/صورة، تحويل فيديو إلى GIF، والمزيد.",
+ "searchToolsPlaceholder": "ابحث عن الأدوات حسب الاسم أو الاستخدام",
+ "noSearchResults": "لم نعثر على أدوات مطابقة لعبارة البحث بعد. جرّب كلمات أوسع مثل PDF أو صورة أو OCR أو ضغط.",
"selectTool": "اختر أداة",
"fileDetected": "اكتشفنا ملف {{type}}",
"unsupportedFile": "نوع الملف غير مدعوم. جرب PDF أو Word أو صور أو فيديو.",
@@ -137,6 +142,17 @@
"feature3Title": "أمان مدمج",
"feature3Desc": "قم بالوصول إلى ملفاتك بأمان، محمية بتشفير تلقائي."
},
+ "socialProof": {
+ "badge": "موثوق من فرق نشطة",
+ "title": "نشاط حي للمنتج من عمليات حقيقية وتقييمات فعلية",
+ "subtitle": "هذه الأرقام تأتي مباشرة من المهام المكتملة وتقييمات الأدوات عبر المنصة.",
+ "processedFiles": "الملفات المعالجة",
+ "successRate": "معدل النجاح",
+ "last24h": "آخر 24 ساعة",
+ "averageRating": "متوسط التقييم",
+ "basedOnRatings": "استنادًا إلى {{count}} تقييمًا مرسلاً",
+ "viewDevelopers": "عرض وثائق المطورين"
+ },
"pages": {
"about": {
"metaDescription": "تعرّف على SaaS-PDF — أدوات ملفات مجانية وسريعة وآمنة عبر الإنترنت لملفات PDF والصور والفيديو والنصوص. لا حاجة للتسجيل.",
@@ -311,14 +327,62 @@
"q": "ما طرق الدفع المقبولة؟",
"a": "نقبل جميع بطاقات الائتمان/الخصم الرئيسية وPayPal. تتم معالجة جميع المدفوعات بأمان عبر Stripe."
}
- ]
+ ],
+ "trustTitle": "مصمم للفرق التي تحتاج سرعة ووضوحًا في النتائج",
+ "trustSubtitle": "المنصة نفسها تدعم الاستخدام السريع من المتصفح، والعمل المتكرر عبر الحساب، وتدفقات المستندات عبر API.",
+ "trustFastTitle": "معالجة سريعة",
+ "trustFastDesc": "تنفيذ المهام غير المتزامنة والعمال المحسّنون يساعدان على استمرار الأعمال الثقيلة دون تعطيل الواجهة.",
+ "trustPrivateTitle": "الخصوصية افتراضيًا",
+ "trustPrivateDesc": "يتم التحقق من الملفات ومعالجتها بأمان ثم تنظيفها تلقائيًا بعد نافذة الاحتفاظ.",
+ "trustApiTitle": "جاهز للتكامل",
+ "trustApiDesc": "يمكن لمساحات العمل الاحترافية إنشاء مفاتيح API وربط الأدوات نفسها مع الأتمتة الداخلية أو تدفقات العملاء."
+ },
+ "developers": {
+ "metaDescription": "استكشف بوابة مطوري SaaS-PDF، وتدفق API غير المتزامن، والنقاط الجاهزة لأتمتة المستندات.",
+ "badge": "بوابة المطورين",
+ "title": "ابنِ تدفقات المستندات فوق واجهة SaaS-PDF البرمجية",
+ "subtitle": "استخدم نقاط التحويل والضغط وOCR والذكاء الاصطناعي نفسها الموجودة خلف التطبيق داخل أنظمتك الخاصة.",
+ "getApiKey": "احصل على مفتاح API",
+ "comparePlans": "قارن الخطط",
+ "openDocs": "افتح وثائق المطورين",
+ "ctaTitle": "هل تحتاج وصول API لمهام مستندات متكررة؟",
+ "ctaSubtitle": "انتقل من الاستخدام الفردي في المتصفح إلى تدفقات قائمة على الحساب مع نقاط غير متزامنة ومفاتيح API.",
+ "authExampleTitle": "مثال: رفع ملف",
+ "authExampleSubtitle": "أرسل ملفًا إلى نقطة v1 باستخدام مفتاح API ثم استلم معرف مهمة للمعالجة غير المتزامنة.",
+ "pollExampleTitle": "مثال: متابعة حالة المهمة",
+ "pollExampleSubtitle": "افحص نقطة حالة المهمة حتى تكتمل المعالجة، ثم استخدم رابط التحميل المعاد.",
+ "endpointsTitle": "مجموعات النقاط الحالية",
+ "endpointsSubtitle": "هذه المجموعات تعكس مسارات API الحقيقية المتاحة حاليًا في الباكند.",
+ "groupConvert": "التحويلات",
+ "groupPdf": "عمليات PDF",
+ "groupAi": "الذكاء الاصطناعي والاستخراج",
+ "steps": {
+ "createKey": {
+ "title": "أنشئ المفتاح",
+ "description": "ولّد مفتاح API احترافي من مساحة عمل حسابك حتى تتمكن الأتمتة من المصادقة بأمان."
+ },
+ "sendFile": {
+ "title": "أرسل الملف",
+ "description": "أرسل الملف المصدر إلى النقطة المطلوبة واحفظ معرف المهمة المعاد داخل نظامك."
+ },
+ "pollStatus": {
+ "title": "تابع ثم حمّل",
+ "description": "تتبّع اكتمال المهمة عبر نقطة الحالة ثم نزّل الملف المعالج عندما يصبح جاهزًا."
+ }
+ }
},
"blog": {
"metaTitle": "المدونة — نصائح ودروس وتحديثات",
"metaDescription": "تعلم كيفية ضغط وتحويل وتعديل وإدارة ملفات PDF مع أدلتنا ودروسنا الاحترافية.",
"title": "المدونة",
"subtitle": "نصائح ودروس تعليمية وتحديثات المنتج لمساعدتك على العمل بذكاء.",
+ "searchPlaceholder": "ابحث في المقالات حسب الموضوع أو الأداة أو سير العمل",
"readMore": "اقرأ المزيد",
+ "backToBlog": "العودة إلى المدونة",
+ "readTime": "{{count}} دقيقة قراءة",
+ "keyTakeaways": "أهم النقاط",
+ "featuredTools": "الأدوات المذكورة في هذا الدليل",
+ "noResults": "لم نجد مقالات مطابقة لعبارة البحث. جرّب PDF أو OCR أو AI أو صورة أو تحويل.",
"comingSoon": "مقالات أخرى قادمة قريبًا — تابعنا!",
"posts": {
"compressPdf": {
@@ -758,6 +822,91 @@
"processingFailed": "فشل استخراج الجداول. يرجى تجربة ملف PDF مختلف.",
"invalidFile": "ملف PDF غير صالح أو تالف. يرجى رفع ملف PDF صحيح."
}
+ },
+ "pdfToPptx": {
+ "title": "PDF إلى باوربوينت",
+ "description": "حوّل ملفات PDF إلى عروض تقديمية (PPTX). كل صفحة تصبح شريحة.",
+ "shortDesc": "تحويل إلى PPTX"
+ },
+ "excelToPdf": {
+ "title": "إكسل إلى PDF",
+ "description": "حوّل جداول بيانات إكسل (XLSX, XLS) إلى مستندات PDF.",
+ "shortDesc": "تحويل إلى PDF"
+ },
+ "pptxToPdf": {
+ "title": "باوربوينت إلى PDF",
+ "description": "حوّل عروض باوربوينت التقديمية (PPTX, PPT) إلى PDF.",
+ "shortDesc": "تحويل إلى PDF"
+ },
+ "signPdf": {
+ "title": "توقيع PDF",
+ "description": "أضف صورة توقيعك إلى أي مستند PDF. وقّع بدون طباعة.",
+ "shortDesc": "توقيع PDF",
+ "pdfLabel": "مستند PDF",
+ "signatureLabel": "صورة التوقيع",
+ "pageLabel": "رقم الصفحة"
+ },
+ "cropPdf": {
+ "title": "قص PDF",
+ "description": "قص صفحات PDF عبر تعديل الهوامش. أزل المساحات البيضاء غير المرغوبة.",
+ "shortDesc": "قص PDF",
+ "marginsLabel": "الهوامش المراد قصها (نقاط)",
+ "top": "أعلى",
+ "bottom": "أسفل",
+ "left": "يسار",
+ "right": "يمين"
+ },
+ "flattenPdf": {
+ "title": "تسطيح PDF",
+ "description": "سطّح نماذج PDF والتعليقات التوضيحية. حوّل الحقول التفاعلية إلى محتوى ثابت.",
+ "shortDesc": "تسطيح PDF"
+ },
+ "repairPdf": {
+ "title": "إصلاح PDF",
+ "description": "أصلح ملفات PDF التالفة أو المعطوبة. استعد المحتوى القابل للقراءة.",
+ "shortDesc": "إصلاح PDF"
+ },
+ "pdfMetadata": {
+ "title": "محرر بيانات PDF الوصفية",
+ "description": "عرض وتحرير البيانات الوصفية لملفات PDF بما في ذلك العنوان والمؤلف والموضوع.",
+ "shortDesc": "تحرير البيانات الوصفية",
+ "titleField": "العنوان",
+ "titlePlaceholder": "عنوان المستند",
+ "author": "المؤلف",
+ "authorPlaceholder": "اسم المؤلف",
+ "subject": "الموضوع",
+ "subjectPlaceholder": "موضوع المستند",
+ "keywords": "الكلمات المفتاحية",
+ "keywordsPlaceholder": "كلمة1، كلمة2، ...",
+ "creator": "المنشئ",
+ "creatorPlaceholder": "اسم التطبيق"
+ },
+ "imageCrop": {
+ "title": "قص الصورة",
+ "description": "قص الصور عبر تحديد إحداثيات البكسل.",
+ "shortDesc": "قص الصورة",
+ "coordsLabel": "إحداثيات القص (بكسل)",
+ "left": "يسار",
+ "top": "أعلى",
+ "right": "يمين",
+ "bottom": "أسفل"
+ },
+ "imageRotateFlip": {
+ "title": "تدوير وقلب الصورة",
+ "description": "دوّر الصور 90° أو 180° أو 270° واقلبها أفقياً أو عمودياً.",
+ "shortDesc": "تحويل الصورة",
+ "rotationLabel": "التدوير",
+ "flipHorizontal": "قلب أفقي",
+ "flipVertical": "قلب عمودي"
+ },
+ "barcode": {
+ "title": "مولد الباركود",
+ "description": "أنشئ باركود بتنسيقات متعددة: Code128، EAN-13، UPC-A، ISBN والمزيد.",
+ "shortDesc": "إنشاء باركود",
+ "dataLabel": "بيانات الباركود",
+ "dataPlaceholder": "أدخل البيانات للترميز...",
+ "typeLabel": "نوع الباركود",
+ "formatLabel": "تنسيق الإخراج"
}
},
"account": {
@@ -805,6 +954,24 @@
"historySubtitle": "ستظهر هنا تلقائيًا كل المهام الناجحة أو الفاشلة المرتبطة بحسابك.",
"historyLoading": "جارٍ تحميل النشاط الأخير...",
"historyEmpty": "لا يوجد سجل ملفات بعد. عالج أي ملف أثناء تسجيل الدخول وسيظهر هنا.",
+ "dashboardTitle": "نظرة عامة على مساحة العمل",
+ "dashboardSubtitle": "عرض سريع لأنماط المعالجة الحديثة، والإخفاقات، وخطوات الإعداد التالية.",
+ "metricProcessed": "الملفات المعالجة",
+ "metricSuccessRate": "معدل النجاح",
+ "metricFavoriteTool": "الأداة الأكثر استخدامًا",
+ "metricFavoriteToolEmpty": "لا يوجد نشاط بعد",
+ "metricFailures": "المهام الفاشلة",
+ "topToolsTitle": "أكثر الأدوات استخدامًا",
+ "issuesTitle": "المشكلات الأخيرة",
+ "issuesEmpty": "لا توجد إخفاقات حديثة. آخر عملياتك اكتملت بنجاح.",
+ "onboardingTitle": "الخطوات التالية",
+ "onboardingSubtitle": "استخدم هذه القائمة لتحويل الحساب الجديد إلى سير عمل متكرر.",
+ "onboardingFirstTaskTitle": "أكمل أول مهمة بعد تسجيل الدخول",
+ "onboardingFirstTaskDesc": "عالج ملفًا واحدًا على الأقل أثناء تسجيل الدخول حتى يبدأ سجل مساحة العمل والقياسات بالامتلاء.",
+ "onboardingUpgradeTitle": "حدّد إن كنت تحتاج حدود Pro",
+ "onboardingUpgradeDesc": "قم بالترقية عندما تحتاج حصصًا أعلى أو وصول API أو سير عمل أنظف للفريق.",
+ "onboardingApiTitle": "أنشئ مفتاح API",
+ "onboardingApiDesc": "يمكن لمستخدمي Pro إنشاء مفاتيح API لربط معالجة المستندات بالأدوات الداخلية أو تدفقات العملاء.",
"downloadResult": "تحميل النتيجة",
"createdAt": "تاريخ الإنشاء",
"originalFile": "الملف الأصلي",
@@ -1188,6 +1355,106 @@
{"q": "هل يمكنني تحويل النص إلى أحرف كبيرة؟", "a": "نعم، يمكنك التحويل إلى أحرف كبيرة أو صغيرة أو حالة العنوان أو حالة الجملة بنقرة واحدة."},
{"q": "هل يدعم النص العربي؟", "a": "نعم، يتضمن خياراً خاصاً لإزالة التشكيل العربي (الحركات) من النص."}
]
+ },
+ "pdfToPptx": {
+ "whatItDoes": "حوّل ملفات PDF إلى عروض تقديمية باوربوينت. كل صفحة تُعرض كصورة عالية الجودة على شريحة منفصلة.",
+ "howToUse": ["ارفع ملف PDF.", "انتظر حتى يكتمل التحويل.", "حمّل عرض PPTX التقديمي."],
+ "benefits": ["كل صفحة تصبح شريحة", "عرض صور عالية الجودة", "لا حاجة لبرامج", "سريع ومجاني"],
+ "useCases": ["تحويل التقارير إلى شرائح عرض تقديمي", "إعادة استخدام محتوى PDF للاجتماعات"],
+ "faq": [
+ {"q": "كيف يعمل تحويل PDF إلى باوربوينت؟", "a": "يتم عرض كل صفحة PDF كصورة عالية الجودة ووضعها على شريحة باوربوينت خاصة بها."}
+ ]
+ },
+ "excelToPdf": {
+ "whatItDoes": "حوّل جداول بيانات إكسل إلى مستندات PDF مع الحفاظ على تنسيق الجداول والخطوط.",
+ "howToUse": ["ارفع ملف XLSX أو XLS.", "انتظر التحويل.", "حمّل PDF."],
+ "benefits": ["يدعم XLSX و XLS", "يحافظ على تنسيق الجداول", "دقة عالية", "مجاني وفوري"],
+ "useCases": ["مشاركة الجداول كملفات PDF غير قابلة للتعديل", "إنشاء نسخ جاهزة للطباعة"],
+ "faq": [
+ {"q": "ما تنسيقات إكسل المدعومة؟", "a": "يدعم تنسيقي XLSX الحديث و XLS القديم."}
+ ]
+ },
+ "pptxToPdf": {
+ "whatItDoes": "حوّل عروض باوربوينت التقديمية إلى PDF للمشاركة والطباعة بسهولة.",
+ "howToUse": ["ارفع ملف PPTX أو PPT.", "انتظر التحويل.", "حمّل PDF."],
+ "benefits": ["يدعم PPTX و PPT", "يحافظ على تخطيط الشرائح", "ممتاز للمشاركة", "لا حاجة لحساب"],
+ "useCases": ["مشاركة العروض التقديمية كملفات PDF", "إنشاء عروض جاهزة للطباعة"],
+ "faq": [
+ {"q": "هل تُحفظ الانتقالات؟", "a": "PDF تنسيق ثابت، لذا لا تُضمّن الانتقالات والرسوم المتحركة، لكن كل المحتوى المرئي يُحفظ."}
+ ]
+ },
+ "signPdf": {
+ "whatItDoes": "أضف صورة توقيعك إلى مستندات PDF بدون طباعة.",
+ "howToUse": ["ارفع مستند PDF.", "ارفع صورة التوقيع (PNG أو JPG).", "اختر رقم الصفحة.", "حمّل PDF الموقّع."],
+ "benefits": ["لا طباعة أو مسح ضوئي", "يدعم PNG و JPG", "ضع التوقيع على أي صفحة", "معالجة آمنة"],
+ "useCases": ["توقيع العقود إلكترونياً", "إضافة توقيعات الموافقة إلى المستندات"],
+ "faq": [
+ {"q": "هل هذا توقيع إلكتروني قانوني؟", "a": "يضع صورة توقيع مرئية. للتوقيعات الرقمية الملزمة قانونياً، قد تكون هناك حاجة لحلول قائمة على الشهادات."}
+ ]
+ },
+ "cropPdf": {
+ "whatItDoes": "قص صفحات PDF بتعديل الهوامش. أزل المساحات البيضاء غير المرغوبة.",
+ "howToUse": ["ارفع ملف PDF.", "حدد قيم الهوامش.", "حمّل PDF المقصوص."],
+ "benefits": ["تحكم دقيق بالهوامش", "قص جميع الصفحات", "إزالة المساحات البيضاء", "مجاني وسريع"],
+ "useCases": ["إزالة الهوامش العريضة", "تعديل أحجام الصفحات"],
+ "faq": [
+ {"q": "ما وحدات الهوامش؟", "a": "الهوامش بنقاط PDF (نقطة واحدة = 1/72 بوصة)."}
+ ]
+ },
+ "flattenPdf": {
+ "whatItDoes": "سطّح نماذج وتعليقات PDF، وحوّل العناصر التفاعلية إلى محتوى ثابت.",
+ "howToUse": ["ارفع PDF مع نماذج أو تعليقات.", "الأداة تسطّح جميع العناصر التفاعلية.", "حمّل PDF المسطّح."],
+ "benefits": ["إزالة تفاعلية حقول النماذج", "تسطيح التعليقات", "منع التحرير", "مثالي للأرشفة"],
+ "useCases": ["أرشفة النماذج المعبأة", "إرسال النماذج المكتملة بأمان"],
+ "faq": [
+ {"q": "ماذا يعني التسطيح؟", "a": "يحوّل العناصر التفاعلية مثل حقول النماذج والتعليقات إلى محتوى دائم غير قابل للتحرير."}
+ ]
+ },
+ "repairPdf": {
+ "whatItDoes": "أصلح ملفات PDF التالفة بإعادة كتابة بنية المستند واستعادة الصفحات المقروءة.",
+ "howToUse": ["ارفع PDF التالف.", "الأداة تحاول إصلاح المستند.", "حمّل PDF المُصلح."],
+ "benefits": ["إصلاح بنى PDF المعطوبة", "استعادة المحتوى", "إخراج نظيف", "مجاني"],
+ "useCases": ["استعادة ملفات PDF التالفة", "إصلاح ملفات لا تفتح"],
+ "faq": [
+ {"q": "هل يمكنه إصلاح أي PDF معطوب؟", "a": "الأداة تستعيد أكبر عدد ممكن من الصفحات. الملفات شديدة التلف قد تكون قابلة للاستعادة جزئياً فقط."}
+ ]
+ },
+ "pdfMetadata": {
+ "whatItDoes": "عرض وتحرير خصائص مستند PDF بما في ذلك العنوان والمؤلف والموضوع والكلمات المفتاحية.",
+ "howToUse": ["ارفع ملف PDF.", "املأ حقول البيانات الوصفية.", "حمّل PDF المحدّث."],
+ "benefits": ["تحرير العنوان والمؤلف والمزيد", "تحسين قابلية البحث", "تنظيف خصائص المستند", "لا حاجة لبرامج"],
+ "useCases": ["تعيين عناوين مناسبة لإدارة المستندات", "إضافة معلومات المؤلف"],
+ "faq": [
+ {"q": "ما هي البيانات الوصفية لـ PDF؟", "a": "تشمل خصائص المستند مثل العنوان والمؤلف والكلمات المفتاحية التي تساعد في تنظيم وبحث ملفات PDF."}
+ ]
+ },
+ "imageCrop": {
+ "whatItDoes": "قص الصور بتحديد إحداثيات البكسل الدقيقة. يدعم PNG و JPG و WebP.",
+ "howToUse": ["ارفع صورتك.", "أدخل إحداثيات القص.", "حمّل الصورة المقصوصة."],
+ "benefits": ["قص دقيق على مستوى البكسل", "يدعم PNG و JPG و WebP", "مخرجات عالية الجودة", "بدون علامات مائية"],
+ "useCases": ["قص صور المنتجات", "إزالة الحواف غير المرغوبة"],
+ "faq": [
+ {"q": "كيف تعمل الإحداثيات؟", "a": "اليسار والأعلى يحددان نقطة البداية، واليمين والأسفل يحددان نقطة النهاية لمنطقة القص بالبكسل."}
+ ]
+ },
+ "imageRotateFlip": {
+ "whatItDoes": "دوّر الصور 90° أو 180° أو 270° واقلبها أفقياً أو عمودياً. ادمج العمليات في خطوة واحدة.",
+ "howToUse": ["ارفع صورتك.", "اختر زاوية التدوير وخيارات القلب.", "حمّل الصورة المحوّلة."],
+ "benefits": ["تدوير 90° أو 180° أو 270°", "قلب أفقي أو عمودي", "دمج العمليات", "يدعم عدة تنسيقات"],
+ "useCases": ["تصحيح اتجاه الصور", "إنشاء صور معكوسة"],
+ "faq": [
+ {"q": "هل يمكنني دمج التدوير والقلب؟", "a": "نعم، يتم تطبيق التدوير والقلب معاً في عملية واحدة."}
+ ]
+ },
+ "barcode": {
+ "whatItDoes": "أنشئ باركود بتنسيقات متعددة بما في ذلك Code128 و Code39 و EAN-13 و UPC-A و ISBN والمزيد. حمّل كـ PNG أو SVG.",
+ "howToUse": ["أدخل البيانات للترميز.", "اختر نوع الباركود.", "اختر تنسيق الإخراج (PNG أو SVG).", "أنشئ وحمّل الباركود."],
+ "benefits": ["تنسيقات باركود متعددة", "إخراج PNG و SVG", "إنشاء فوري", "مجاني وبلا حدود"],
+ "useCases": ["إنشاء باركود المنتجات", "إنشاء ملصقات المخزون", "إنتاج باركود ISBN للكتب"],
+ "faq": [
+ {"q": "ما تنسيقات الباركود المتاحة؟", "a": "Code128, Code39, EAN-13, EAN-8, UPC-A, ISBN-13, ISBN-10, ISSN, و PZN."},
+ {"q": "ما الفرق عن رمز QR؟", "a": "الباركود خطي (أحادي البعد) بسعة بيانات أقل. رموز QR ثنائية الأبعاد وتخزن معلومات أكثر."}
+ ]
}
}
}
diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json
index fd671a1..aaf238f 100644
--- a/frontend/src/i18n/en.json
+++ b/frontend/src/i18n/en.json
@@ -17,6 +17,8 @@
"privacy": "Privacy Policy",
"terms": "Terms of Service",
"language": "Language",
+ "search": "Search",
+ "clear": "Clear",
"allTools": "All Tools",
"account": "Account",
"signIn": "Sign In",
@@ -27,6 +29,7 @@
"contact": "Contact",
"pricing": "Pricing",
"blog": "Blog",
+ "developers": "Developers",
"send": "Send",
"subject": "Subject",
"message": "Message",
@@ -121,6 +124,8 @@
"editNowTooltip": "Open quick PDF optimization for a cleaner downloadable copy",
"suggestedTools": "Suggested Tools for Your File",
"suggestedToolsDesc": "After uploading, we automatically show compatible tools: text editing, highlighting, merge/split, compress, convert to Word/image, video to GIF, and more.",
+ "searchToolsPlaceholder": "Search tools by name or use case",
+ "noSearchResults": "No tools matched your search yet. Try a broader term like PDF, image, OCR, or compress.",
"selectTool": "Choose a Tool",
"fileDetected": "We detected a {{type}} file",
"unsupportedFile": "This file type is not supported. Try PDF, Word, images, or video.",
@@ -137,6 +142,17 @@
"feature3Title": "Built-in security",
"feature3Desc": "Access files securely, protected by automatic encryption."
},
+ "socialProof": {
+ "badge": "Trusted by active teams",
+ "title": "Live product activity from real processing and ratings",
+ "subtitle": "These numbers come directly from completed tasks and tool feedback across the platform.",
+ "processedFiles": "Files processed",
+ "successRate": "Success rate",
+ "last24h": "Last 24 hours",
+ "averageRating": "Average rating",
+ "basedOnRatings": "Based on {{count}} submitted ratings",
+ "viewDevelopers": "View developer docs"
+ },
"pages": {
"about": {
"metaDescription": "Learn about SaaS-PDF — free, fast, and secure online file tools for PDFs, images, video, and text. No registration required.",
@@ -311,14 +327,62 @@
"q": "What payment methods do you accept?",
"a": "We accept all major credit/debit cards and PayPal. All payments are securely processed via Stripe."
}
- ]
+ ],
+ "trustTitle": "Built for teams that need speed and predictability",
+ "trustSubtitle": "The same platform powers quick browser workflows, recurring account usage, and API-driven document pipelines.",
+ "trustFastTitle": "Fast processing",
+ "trustFastDesc": "Async task handling and optimized workers keep heavy jobs moving without blocking the interface.",
+ "trustPrivateTitle": "Private by default",
+ "trustPrivateDesc": "Uploads are validated, processed securely, and cleaned up automatically after the retention window.",
+ "trustApiTitle": "Ready for integration",
+ "trustApiDesc": "Pro workspaces can generate API keys and connect the same tools to internal automations and client flows."
+ },
+ "developers": {
+ "metaDescription": "Explore the SaaS-PDF developer portal, async API flow, and production-ready endpoints for document automation.",
+ "badge": "Developer Portal",
+ "title": "Build document workflows on top of the SaaS-PDF API",
+ "subtitle": "Use the same conversion, compression, OCR, and AI endpoints behind the web app inside your own systems.",
+ "getApiKey": "Get an API key",
+ "comparePlans": "Compare plans",
+ "openDocs": "Open developer docs",
+ "ctaTitle": "Need API access for repeated document jobs?",
+ "ctaSubtitle": "Move from one-off browser usage to account-based workflows with async endpoints and API keys.",
+ "authExampleTitle": "Example: upload a file",
+ "authExampleSubtitle": "Send a file to a v1 endpoint with your API key and receive a task identifier for async processing.",
+ "pollExampleTitle": "Example: poll task status",
+ "pollExampleSubtitle": "Check the task endpoint until processing finishes, then use the returned download URL.",
+ "endpointsTitle": "Current endpoint groups",
+ "endpointsSubtitle": "These groups reflect real API routes currently available in the backend.",
+ "groupConvert": "Conversions",
+ "groupPdf": "PDF operations",
+ "groupAi": "AI and extraction",
+ "steps": {
+ "createKey": {
+ "title": "Create your key",
+ "description": "Generate a Pro API key from your account workspace so your automation can authenticate securely."
+ },
+ "sendFile": {
+ "title": "Send a file",
+ "description": "Post the source file to the target endpoint and store the returned task ID in your system."
+ },
+ "pollStatus": {
+ "title": "Poll and download",
+ "description": "Track task completion through the status endpoint and download the processed file when ready."
+ }
+ }
},
"blog": {
"metaTitle": "Blog — Tips, Tutorials & Updates",
"metaDescription": "Learn how to compress, convert, edit, and manage PDF files with our expert guides and tutorials.",
"title": "Blog",
"subtitle": "Tips, tutorials, and product updates to help you work smarter.",
+ "searchPlaceholder": "Search articles by topic, tool, or workflow",
"readMore": "Read more",
+ "backToBlog": "Back to blog",
+ "readTime": "{{count}} min read",
+ "keyTakeaways": "Key takeaways",
+ "featuredTools": "Tools mentioned in this guide",
+ "noResults": "No articles matched your search. Try PDF, OCR, AI, image, or convert.",
"comingSoon": "More articles coming soon — stay tuned!",
"posts": {
"compressPdf": {
@@ -758,6 +822,91 @@
"processingFailed": "Failed to extract tables. Please try a different PDF.",
"invalidFile": "Invalid or corrupted PDF file. Please upload a valid PDF."
}
+ },
+ "pdfToPptx": {
+ "title": "PDF to PowerPoint",
+ "description": "Convert PDF files to PowerPoint (PPTX) presentations. Each page becomes a slide.",
+ "shortDesc": "Convert to PPTX"
+ },
+ "excelToPdf": {
+ "title": "Excel to PDF",
+ "description": "Convert Excel spreadsheets (XLSX, XLS) to PDF documents online.",
+ "shortDesc": "Convert to PDF"
+ },
+ "pptxToPdf": {
+ "title": "PowerPoint to PDF",
+ "description": "Convert PowerPoint presentations (PPTX, PPT) to PDF format.",
+ "shortDesc": "Convert to PDF"
+ },
+ "signPdf": {
+ "title": "Sign PDF",
+ "description": "Add your signature image to any PDF document. Sign PDFs without printing.",
+ "shortDesc": "Sign PDF",
+ "pdfLabel": "PDF Document",
+ "signatureLabel": "Signature Image",
+ "pageLabel": "Page Number"
+ },
+ "cropPdf": {
+ "title": "Crop PDF",
+ "description": "Crop PDF pages by adjusting margins. Remove unwanted whitespace.",
+ "shortDesc": "Crop PDF",
+ "marginsLabel": "Margins to trim (points)",
+ "top": "Top",
+ "bottom": "Bottom",
+ "left": "Left",
+ "right": "Right"
+ },
+ "flattenPdf": {
+ "title": "Flatten PDF",
+ "description": "Flatten PDF forms and annotations. Convert interactive fields to fixed content.",
+ "shortDesc": "Flatten PDF"
+ },
+ "repairPdf": {
+ "title": "Repair PDF",
+ "description": "Repair corrupted or damaged PDF files. Fix broken documents and recover content.",
+ "shortDesc": "Repair PDF"
+ },
+ "pdfMetadata": {
+ "title": "PDF Metadata Editor",
+ "description": "View and edit PDF metadata including title, author, subject, and keywords.",
+ "shortDesc": "Edit Metadata",
+ "titleField": "Title",
+ "titlePlaceholder": "Document title",
+ "author": "Author",
+ "authorPlaceholder": "Author name",
+ "subject": "Subject",
+ "subjectPlaceholder": "Document subject",
+ "keywords": "Keywords",
+ "keywordsPlaceholder": "keyword1, keyword2, ...",
+ "creator": "Creator",
+ "creatorPlaceholder": "Application name"
+ },
+ "imageCrop": {
+ "title": "Crop Image",
+ "description": "Crop images online by specifying exact pixel coordinates.",
+ "shortDesc": "Crop Image",
+ "coordsLabel": "Crop coordinates (pixels)",
+ "left": "Left",
+ "top": "Top",
+ "right": "Right",
+ "bottom": "Bottom"
+ },
+ "imageRotateFlip": {
+ "title": "Rotate & Flip Image",
+ "description": "Rotate images by 90°, 180°, or 270° and flip horizontally or vertically.",
+ "shortDesc": "Transform Image",
+ "rotationLabel": "Rotation",
+ "flipHorizontal": "Flip Horizontal",
+ "flipVertical": "Flip Vertical"
+ },
+ "barcode": {
+ "title": "Barcode Generator",
+ "description": "Generate barcodes in various formats: Code128, EAN-13, UPC-A, ISBN, and more.",
+ "shortDesc": "Generate Barcode",
+ "dataLabel": "Barcode Data",
+ "dataPlaceholder": "Enter data to encode...",
+ "typeLabel": "Barcode Type",
+ "formatLabel": "Output Format"
}
},
"account": {
@@ -805,6 +954,24 @@
"historySubtitle": "Completed and failed tasks tied to your account appear here automatically.",
"historyLoading": "Loading recent activity...",
"historyEmpty": "No file history yet. Process a file while signed in and it will appear here.",
+ "dashboardTitle": "Workspace overview",
+ "dashboardSubtitle": "A quick view of your recent processing patterns, failures, and next setup steps.",
+ "metricProcessed": "Processed files",
+ "metricSuccessRate": "Success rate",
+ "metricFavoriteTool": "Most used tool",
+ "metricFavoriteToolEmpty": "No activity yet",
+ "metricFailures": "Failed tasks",
+ "topToolsTitle": "Top tools",
+ "issuesTitle": "Recent issues",
+ "issuesEmpty": "No recent failures. Your latest runs completed successfully.",
+ "onboardingTitle": "Next steps",
+ "onboardingSubtitle": "Use this checklist to turn a new account into a repeatable workflow.",
+ "onboardingFirstTaskTitle": "Complete your first signed-in task",
+ "onboardingFirstTaskDesc": "Process at least one file while logged in so your workspace history and metrics start filling in.",
+ "onboardingUpgradeTitle": "Decide if you need Pro limits",
+ "onboardingUpgradeDesc": "Upgrade when you need higher quotas, API access, or a cleaner team workflow.",
+ "onboardingApiTitle": "Create an API key",
+ "onboardingApiDesc": "Pro users can generate API keys to connect document processing to internal tools or customer flows.",
"downloadResult": "Download Result",
"createdAt": "Created",
"originalFile": "Original file",
@@ -1188,6 +1355,116 @@
{"q": "Can I convert text to uppercase?", "a": "Yes, you can convert to uppercase, lowercase, title case, or sentence case with a single click."},
{"q": "Does it support Arabic text?", "a": "Yes, it includes a special option to remove Arabic diacritics (tashkeel/harakat) from text."}
]
+ },
+ "pdfToPptx": {
+ "whatItDoes": "Convert PDF files to PowerPoint presentations. Each page is rendered as a high-quality slide image, preserving the visual layout perfectly.",
+ "howToUse": ["Upload your PDF file.", "Wait for the conversion to process.", "Download your PPTX presentation."],
+ "benefits": ["Each PDF page becomes a slide", "High-quality image rendering", "No software required", "Fast and free"],
+ "useCases": ["Turning reports into presentation slides", "Repurposing PDF content for meetings", "Creating editable presentations from static documents"],
+ "faq": [
+ {"q": "How does PDF to PowerPoint conversion work?", "a": "Each PDF page is rendered as a high-quality image and placed on its own PowerPoint slide."},
+ {"q": "Can I edit the text in the resulting slides?", "a": "The slides contain page images. For text editing, convert to Word first."}
+ ]
+ },
+ "excelToPdf": {
+ "whatItDoes": "Convert Excel spreadsheets to PDF documents while preserving table formatting, fonts, and layout.",
+ "howToUse": ["Upload your XLSX or XLS file.", "Wait for the conversion.", "Download the PDF."],
+ "benefits": ["Supports XLSX and XLS", "Preserves table formatting", "Uses LibreOffice for accuracy", "Free and instant"],
+ "useCases": ["Sharing spreadsheets as non-editable PDFs", "Creating printable versions of reports", "Archiving financial documents"],
+ "faq": [
+ {"q": "Which Excel formats are supported?", "a": "Both modern XLSX and legacy XLS formats are fully supported."},
+ {"q": "Are charts preserved?", "a": "Yes, charts and formatting are preserved in the PDF output."}
+ ]
+ },
+ "pptxToPdf": {
+ "whatItDoes": "Convert PowerPoint presentations to PDF format for easy sharing and printing. Preserves slide layout and graphics.",
+ "howToUse": ["Upload your PPTX or PPT file.", "Wait for the conversion to complete.", "Download the PDF."],
+ "benefits": ["Supports PPTX and PPT", "Preserves slide layout", "Great for sharing", "No account needed"],
+ "useCases": ["Sharing presentations as PDFs", "Creating print-ready slide decks", "Archiving presentations"],
+ "faq": [
+ {"q": "Are slide transitions preserved?", "a": "PDF is static, so transitions and animations are not included, but all visual content is preserved."},
+ {"q": "Can I convert PPT files too?", "a": "Yes, both PPTX and legacy PPT formats are supported."}
+ ]
+ },
+ "signPdf": {
+ "whatItDoes": "Add your signature image to PDF documents without printing. Upload a signature image and place it on any page.",
+ "howToUse": ["Upload your PDF document.", "Upload your signature image (PNG or JPG).", "Choose the page number.", "Download the signed PDF."],
+ "benefits": ["No printing or scanning needed", "Supports PNG and JPG signatures", "Place on any page", "Secure processing"],
+ "useCases": ["Signing contracts electronically", "Adding approval signatures to documents", "Signing forms without printing"],
+ "faq": [
+ {"q": "Is this a legal electronic signature?", "a": "This places a visual signature image. For legally binding digital signatures, certificate-based solutions may be required."},
+ {"q": "What image formats work for signatures?", "a": "PNG (recommended for transparency) and JPG formats are supported."}
+ ]
+ },
+ "cropPdf": {
+ "whatItDoes": "Crop PDF pages by adjusting margins. Remove unwanted whitespace and trim documents to the desired size.",
+ "howToUse": ["Upload your PDF.", "Set margin values for each side.", "Download the cropped PDF."],
+ "benefits": ["Precise margin control", "Trim all pages at once", "Remove unwanted whitespace", "Free and fast"],
+ "useCases": ["Removing wide margins from scanned documents", "Trimming PDFs for better screen reading", "Adjusting page sizes for printing"],
+ "faq": [
+ {"q": "What units are the margins in?", "a": "Margins are specified in PDF points (1 point = 1/72 inch)."},
+ {"q": "Can I crop specific pages only?", "a": "Currently all pages are cropped with the same margins."}
+ ]
+ },
+ "flattenPdf": {
+ "whatItDoes": "Flatten PDF forms and annotations, converting interactive elements into static content that cannot be edited.",
+ "howToUse": ["Upload your PDF with forms or annotations.", "The tool flattens all interactive elements.", "Download the flattened PDF."],
+ "benefits": ["Remove form field interactivity", "Flatten annotations", "Prevent further editing", "Ideal for archiving"],
+ "useCases": ["Archiving filled forms", "Sending completed forms securely", "Reducing file complexity"],
+ "faq": [
+ {"q": "What does flattening mean?", "a": "Flattening converts interactive elements like form fields and annotations into permanent, non-editable content."},
+ {"q": "Can I undo flattening?", "a": "No, flattening is permanent. Keep a backup of the original file."}
+ ]
+ },
+ "repairPdf": {
+ "whatItDoes": "Repair corrupted or damaged PDF files by re-writing the document structure and recovering readable pages.",
+ "howToUse": ["Upload your corrupted PDF.", "The tool attempts to fix the document.", "Download the repaired PDF."],
+ "benefits": ["Fix broken PDF structures", "Recover readable content", "Re-write clean output", "Free to use"],
+ "useCases": ["Recovering damaged PDFs from old storage", "Fixing PDFs that won't open", "Repairing partially downloaded files"],
+ "faq": [
+ {"q": "Can it fix any broken PDF?", "a": "The tool recovers as many pages as possible. Severely corrupted files may only be partially recoverable."},
+ {"q": "Will the repaired file look the same?", "a": "In most cases yes, though some complex elements may be simplified during repair."}
+ ]
+ },
+ "pdfMetadata": {
+ "whatItDoes": "View and edit PDF document properties including title, author, subject, keywords, and creator information.",
+ "howToUse": ["Upload your PDF.", "Fill in the metadata fields you want to change.", "Download the updated PDF."],
+ "benefits": ["Edit title, author, and more", "Improve document searchability", "Clean up document properties", "No software needed"],
+ "useCases": ["Setting proper titles for document management", "Adding author information", "Preparing PDFs for archival systems"],
+ "faq": [
+ {"q": "What is PDF metadata?", "a": "Metadata includes document properties like title, author, and keywords that help organize and search PDFs."},
+ {"q": "Can I remove all metadata?", "a": "Yes, leave all fields blank to clear existing metadata."}
+ ]
+ },
+ "imageCrop": {
+ "whatItDoes": "Crop images by specifying exact pixel coordinates. Supports PNG, JPG, and WebP formats.",
+ "howToUse": ["Upload your image.", "Enter crop coordinates (left, top, right, bottom).", "Download the cropped image."],
+ "benefits": ["Precise pixel-level cropping", "Supports PNG, JPG, WebP", "High-quality output", "No watermarks"],
+ "useCases": ["Trimming product photos", "Removing unwanted borders", "Creating thumbnails"],
+ "faq": [
+ {"q": "How do coordinates work?", "a": "Left and top define the starting point, right and bottom define the ending point of the crop area in pixels."},
+ {"q": "What formats are supported?", "a": "PNG, JPG/JPEG, and WebP are supported."}
+ ]
+ },
+ "imageRotateFlip": {
+ "whatItDoes": "Rotate images by 90°, 180°, or 270° and flip them horizontally or vertically. Combine operations in one step.",
+ "howToUse": ["Upload your image.", "Choose rotation angle and flip options.", "Download the transformed image."],
+ "benefits": ["Rotate by 90°, 180°, or 270°", "Flip horizontal or vertical", "Combine operations", "Supports multiple formats"],
+ "useCases": ["Fixing photo orientation", "Creating mirror images", "Adjusting scanned document rotation"],
+ "faq": [
+ {"q": "Can I combine rotation and flip?", "a": "Yes, rotation and flip are applied together in a single operation."},
+ {"q": "Does rotation affect quality?", "a": "Rotation is lossless for PNG. JPG quality is preserved as closely as possible."}
+ ]
+ },
+ "barcode": {
+ "whatItDoes": "Generate barcodes in various formats including Code128, Code39, EAN-13, UPC-A, ISBN, and more. Download as PNG or SVG.",
+ "howToUse": ["Enter the data to encode.", "Select a barcode type.", "Choose output format (PNG or SVG).", "Generate and download your barcode."],
+ "benefits": ["Multiple barcode formats", "PNG and SVG output", "Instant generation", "Free and unlimited"],
+ "useCases": ["Generating product barcodes", "Creating inventory labels", "Producing ISBN barcodes for books"],
+ "faq": [
+ {"q": "What barcode formats are available?", "a": "Code128, Code39, EAN-13, EAN-8, UPC-A, ISBN-13, ISBN-10, ISSN, and PZN."},
+ {"q": "What is the difference from a QR code?", "a": "Barcodes are linear (1D) with less data capacity. QR codes are 2D and store more information."}
+ ]
}
}
}
diff --git a/frontend/src/i18n/fr.json b/frontend/src/i18n/fr.json
index 859be2e..bf9b249 100644
--- a/frontend/src/i18n/fr.json
+++ b/frontend/src/i18n/fr.json
@@ -17,6 +17,8 @@
"privacy": "Politique de confidentialité",
"terms": "Conditions d'utilisation",
"language": "Langue",
+ "search": "Rechercher",
+ "clear": "Effacer",
"allTools": "Tous les outils",
"account": "Compte",
"signIn": "Se connecter",
@@ -27,6 +29,7 @@
"contact": "Contact",
"pricing": "Tarifs",
"blog": "Blog",
+ "developers": "Développeurs",
"send": "Envoyer",
"subject": "Sujet",
"message": "Message",
@@ -121,6 +124,8 @@
"editNowTooltip": "Ouvrir l'optimiseur PDF rapide pour générer une copie propre téléchargeable",
"suggestedTools": "Outils suggérés pour votre fichier",
"suggestedToolsDesc": "Après le téléchargement, nous affichons automatiquement les outils compatibles : édition de texte, surlignage, fusion/division, compression, conversion en Word/image, vidéo en GIF, et plus.",
+ "searchToolsPlaceholder": "Rechercher un outil par nom ou usage",
+ "noSearchResults": "Aucun outil ne correspond encore à votre recherche. Essayez un terme plus large comme PDF, image, OCR ou compression.",
"selectTool": "Choisir un outil",
"fileDetected": "Nous avons détecté un fichier {{type}}",
"unsupportedFile": "Ce type de fichier n'est pas pris en charge. Essayez PDF, Word, images ou vidéo.",
@@ -137,6 +142,17 @@
"feature3Title": "Sécurité intégrée",
"feature3Desc": "Accédez aux fichiers en toute sécurité, protégés par un cryptage automatique."
},
+ "socialProof": {
+ "badge": "Adopté par des équipes actives",
+ "title": "Une activité produit réelle issue des traitements et des avis",
+ "subtitle": "Ces chiffres proviennent directement des tâches terminées et des retours sur les outils dans toute la plateforme.",
+ "processedFiles": "Fichiers traités",
+ "successRate": "Taux de réussite",
+ "last24h": "Dernières 24 h",
+ "averageRating": "Note moyenne",
+ "basedOnRatings": "Basé sur {{count}} avis envoyés",
+ "viewDevelopers": "Voir la documentation développeur"
+ },
"pages": {
"about": {
"metaDescription": "Découvrez SaaS-PDF — outils en ligne gratuits, rapides et sécurisés pour les PDF, images, vidéos et textes. Aucune inscription requise.",
@@ -311,14 +327,62 @@
"q": "Quels moyens de paiement acceptez-vous ?",
"a": "Nous acceptons toutes les cartes de crédit/débit principales et PayPal. Tous les paiements sont traités de manière sécurisée via Stripe."
}
- ]
+ ],
+ "trustTitle": "Conçu pour les équipes qui ont besoin de vitesse et de prévisibilité",
+ "trustSubtitle": "La même plateforme prend en charge les usages rapides dans le navigateur, les workflows récurrents liés au compte et les pipelines documentaires via API.",
+ "trustFastTitle": "Traitement rapide",
+ "trustFastDesc": "Les tâches asynchrones et les workers optimisés permettent aux traitements lourds d'avancer sans bloquer l'interface.",
+ "trustPrivateTitle": "Privé par défaut",
+ "trustPrivateDesc": "Les fichiers sont validés, traités de manière sécurisée puis supprimés automatiquement après la fenêtre de rétention.",
+ "trustApiTitle": "Prêt pour l'intégration",
+ "trustApiDesc": "Les espaces Pro peuvent générer des clés API et connecter les mêmes outils à des automatisations internes ou à des parcours clients."
+ },
+ "developers": {
+ "metaDescription": "Explorez le portail développeur SaaS-PDF, le flux API asynchrone et les endpoints prêts pour l'automatisation documentaire.",
+ "badge": "Portail développeur",
+ "title": "Construisez des workflows documentaires sur l'API SaaS-PDF",
+ "subtitle": "Utilisez dans vos propres systèmes les mêmes endpoints de conversion, compression, OCR et IA que ceux de l'application web.",
+ "getApiKey": "Obtenir une clé API",
+ "comparePlans": "Comparer les forfaits",
+ "openDocs": "Ouvrir la documentation développeur",
+ "ctaTitle": "Besoin d'un accès API pour des traitements documentaires récurrents ?",
+ "ctaSubtitle": "Passez d'un usage ponctuel dans le navigateur à des workflows basés sur un compte avec endpoints asynchrones et clés API.",
+ "authExampleTitle": "Exemple : envoyer un fichier",
+ "authExampleSubtitle": "Envoyez un fichier à un endpoint v1 avec votre clé API et récupérez un identifiant de tâche pour le traitement asynchrone.",
+ "pollExampleTitle": "Exemple : interroger l'état d'une tâche",
+ "pollExampleSubtitle": "Vérifiez l'endpoint d'état jusqu'à la fin du traitement, puis utilisez l'URL de téléchargement renvoyée.",
+ "endpointsTitle": "Groupes d'endpoints actuels",
+ "endpointsSubtitle": "Ces groupes reflètent les routes API réellement disponibles aujourd'hui dans le backend.",
+ "groupConvert": "Conversions",
+ "groupPdf": "Opérations PDF",
+ "groupAi": "IA et extraction",
+ "steps": {
+ "createKey": {
+ "title": "Créez votre clé",
+ "description": "Générez une clé API Pro depuis votre espace compte afin que votre automatisation puisse s'authentifier de façon sécurisée."
+ },
+ "sendFile": {
+ "title": "Envoyez un fichier",
+ "description": "Postez le fichier source vers l'endpoint cible et enregistrez l'identifiant de tâche retourné dans votre système."
+ },
+ "pollStatus": {
+ "title": "Vérifiez puis téléchargez",
+ "description": "Suivez la progression via l'endpoint d'état puis téléchargez le fichier traité dès qu'il est prêt."
+ }
+ }
},
"blog": {
"metaTitle": "Blog — Conseils, tutoriels et mises à jour",
"metaDescription": "Apprenez à compresser, convertir, éditer et gérer des fichiers PDF avec nos guides et tutoriels experts.",
"title": "Blog",
"subtitle": "Conseils, tutoriels et mises à jour produit pour vous aider à travailler plus intelligemment.",
+ "searchPlaceholder": "Rechercher des articles par sujet, outil ou workflow",
"readMore": "Lire la suite",
+ "backToBlog": "Retour au blog",
+ "readTime": "{{count}} min de lecture",
+ "keyTakeaways": "À retenir",
+ "featuredTools": "Outils mentionnés dans ce guide",
+ "noResults": "Aucun article ne correspond à votre recherche. Essayez PDF, OCR, IA, image ou conversion.",
"comingSoon": "D'autres articles arrivent bientôt — restez connecté !",
"posts": {
"compressPdf": {
@@ -758,6 +822,91 @@
"processingFailed": "Échec de l'extraction des tableaux. Veuillez essayer un autre PDF.",
"invalidFile": "Fichier PDF invalide ou corrompu. Veuillez télécharger un PDF valide."
}
+ },
+ "pdfToPptx": {
+ "title": "PDF vers PowerPoint",
+ "description": "Convertissez des fichiers PDF en présentations PowerPoint (PPTX). Chaque page devient une diapositive.",
+ "shortDesc": "Convertir en PPTX"
+ },
+ "excelToPdf": {
+ "title": "Excel vers PDF",
+ "description": "Convertissez des feuilles de calcul Excel (XLSX, XLS) en documents PDF.",
+ "shortDesc": "Convertir en PDF"
+ },
+ "pptxToPdf": {
+ "title": "PowerPoint vers PDF",
+ "description": "Convertissez des présentations PowerPoint (PPTX, PPT) au format PDF.",
+ "shortDesc": "Convertir en PDF"
+ },
+ "signPdf": {
+ "title": "Signer un PDF",
+ "description": "Ajoutez votre image de signature à n'importe quel document PDF. Signez sans imprimer.",
+ "shortDesc": "Signer le PDF",
+ "pdfLabel": "Document PDF",
+ "signatureLabel": "Image de signature",
+ "pageLabel": "Numéro de page"
+ },
+ "cropPdf": {
+ "title": "Rogner un PDF",
+ "description": "Rognez les pages PDF en ajustant les marges. Supprimez les espaces blancs indésirables.",
+ "shortDesc": "Rogner le PDF",
+ "marginsLabel": "Marges à rogner (points)",
+ "top": "Haut",
+ "bottom": "Bas",
+ "left": "Gauche",
+ "right": "Droite"
+ },
+ "flattenPdf": {
+ "title": "Aplatir un PDF",
+ "description": "Aplatissez les formulaires et annotations PDF. Convertissez les champs interactifs en contenu fixe.",
+ "shortDesc": "Aplatir le PDF"
+ },
+ "repairPdf": {
+ "title": "Réparer un PDF",
+ "description": "Réparez les fichiers PDF corrompus ou endommagés. Récupérez le contenu lisible.",
+ "shortDesc": "Réparer le PDF"
+ },
+ "pdfMetadata": {
+ "title": "Éditeur de métadonnées PDF",
+ "description": "Affichez et modifiez les métadonnées PDF : titre, auteur, sujet et mots-clés.",
+ "shortDesc": "Modifier les métadonnées",
+ "titleField": "Titre",
+ "titlePlaceholder": "Titre du document",
+ "author": "Auteur",
+ "authorPlaceholder": "Nom de l'auteur",
+ "subject": "Sujet",
+ "subjectPlaceholder": "Sujet du document",
+ "keywords": "Mots-clés",
+ "keywordsPlaceholder": "mot1, mot2, ...",
+ "creator": "Créateur",
+ "creatorPlaceholder": "Nom de l'application"
+ },
+ "imageCrop": {
+ "title": "Rogner une image",
+ "description": "Rognez des images en spécifiant les coordonnées exactes en pixels.",
+ "shortDesc": "Rogner l'image",
+ "coordsLabel": "Coordonnées de rognage (pixels)",
+ "left": "Gauche",
+ "top": "Haut",
+ "right": "Droite",
+ "bottom": "Bas"
+ },
+ "imageRotateFlip": {
+ "title": "Rotation et retournement d'image",
+ "description": "Faites pivoter les images de 90°, 180° ou 270° et retournez-les horizontalement ou verticalement.",
+ "shortDesc": "Transformer l'image",
+ "rotationLabel": "Rotation",
+ "flipHorizontal": "Retournement horizontal",
+ "flipVertical": "Retournement vertical"
+ },
+ "barcode": {
+ "title": "Générateur de code-barres",
+ "description": "Générez des codes-barres en plusieurs formats : Code128, EAN-13, UPC-A, ISBN et plus.",
+ "shortDesc": "Générer un code-barres",
+ "dataLabel": "Données du code-barres",
+ "dataPlaceholder": "Entrez les données à encoder...",
+ "typeLabel": "Type de code-barres",
+ "formatLabel": "Format de sortie"
}
},
"account": {
@@ -805,6 +954,24 @@
"historySubtitle": "Les tâches réussies et échouées liées à votre compte apparaissent ici automatiquement.",
"historyLoading": "Chargement de l'activité récente...",
"historyEmpty": "Aucun historique pour l'instant. Traitez un fichier en étant connecté et il apparaîtra ici.",
+ "dashboardTitle": "Vue d'ensemble de l'espace",
+ "dashboardSubtitle": "Un aperçu rapide de vos usages récents, des échecs et des prochaines étapes de configuration.",
+ "metricProcessed": "Fichiers traités",
+ "metricSuccessRate": "Taux de réussite",
+ "metricFavoriteTool": "Outil le plus utilisé",
+ "metricFavoriteToolEmpty": "Aucune activité pour le moment",
+ "metricFailures": "Tâches en échec",
+ "topToolsTitle": "Outils les plus utilisés",
+ "issuesTitle": "Problèmes récents",
+ "issuesEmpty": "Aucun échec récent. Vos derniers traitements se sont terminés avec succès.",
+ "onboardingTitle": "Étapes suivantes",
+ "onboardingSubtitle": "Utilisez cette checklist pour transformer un nouveau compte en workflow réutilisable.",
+ "onboardingFirstTaskTitle": "Terminez votre première tâche connectée",
+ "onboardingFirstTaskDesc": "Traitez au moins un fichier en étant connecté pour commencer à alimenter l'historique et les indicateurs de votre espace.",
+ "onboardingUpgradeTitle": "Évaluez si vous avez besoin de Pro",
+ "onboardingUpgradeDesc": "Passez à Pro si vous avez besoin de quotas plus élevés, d'un accès API ou d'un workflow d'équipe plus propre.",
+ "onboardingApiTitle": "Créez une clé API",
+ "onboardingApiDesc": "Les utilisateurs Pro peuvent générer des clés API pour relier le traitement documentaire à des outils internes ou à des parcours clients.",
"downloadResult": "Télécharger le résultat",
"createdAt": "Créé le",
"originalFile": "Fichier source",
@@ -1188,6 +1355,86 @@
{"q": "Puis-je convertir le texte en majuscules ?", "a": "Oui, vous pouvez convertir en majuscules, minuscules, casse de titre ou casse de phrase en un clic."},
{"q": "Est-ce que ça prend en charge le texte arabe ?", "a": "Oui, il inclut une option spéciale pour supprimer les diacritiques arabes (tachkil) du texte."}
]
+ },
+ "pdfToPptx": {
+ "whatItDoes": "Convertissez des fichiers PDF en présentations PowerPoint. Chaque page est rendue comme une image haute qualité sur une diapositive séparée.",
+ "howToUse": ["Téléchargez votre fichier PDF.", "Attendez la fin de la conversion.", "Téléchargez votre présentation PPTX."],
+ "benefits": ["Chaque page devient une diapositive", "Rendu d'images haute qualité", "Aucun logiciel requis", "Rapide et gratuit"],
+ "useCases": ["Transformer des rapports en diapositives de présentation", "Réutiliser le contenu PDF pour des réunions"],
+ "faq": [{"q": "Comment fonctionne la conversion PDF vers PowerPoint ?", "a": "Chaque page PDF est rendue comme image haute qualité et placée sur sa propre diapositive PowerPoint."}]
+ },
+ "excelToPdf": {
+ "whatItDoes": "Convertissez des feuilles de calcul Excel en documents PDF en préservant le formatage des tableaux.",
+ "howToUse": ["Téléchargez votre fichier XLSX ou XLS.", "Attendez la conversion.", "Téléchargez le PDF."],
+ "benefits": ["Supporte XLSX et XLS", "Préserve le formatage", "Haute précision", "Gratuit et instantané"],
+ "useCases": ["Partager des feuilles de calcul en PDF non modifiables", "Créer des versions imprimables"],
+ "faq": [{"q": "Quels formats Excel sont supportés ?", "a": "Les formats XLSX moderne et XLS hérité sont entièrement supportés."}]
+ },
+ "pptxToPdf": {
+ "whatItDoes": "Convertissez des présentations PowerPoint en format PDF pour un partage et une impression faciles.",
+ "howToUse": ["Téléchargez votre fichier PPTX ou PPT.", "Attendez la conversion.", "Téléchargez le PDF."],
+ "benefits": ["Supporte PPTX et PPT", "Préserve la mise en page des diapositives", "Idéal pour le partage", "Aucun compte nécessaire"],
+ "useCases": ["Partager des présentations en PDF", "Créer des dossiers de diapositives prêts à imprimer"],
+ "faq": [{"q": "Les transitions sont-elles préservées ?", "a": "Le PDF est un format statique, donc les transitions et animations ne sont pas incluses, mais tout le contenu visuel est préservé."}]
+ },
+ "signPdf": {
+ "whatItDoes": "Ajoutez votre image de signature à des documents PDF sans imprimer.",
+ "howToUse": ["Téléchargez votre document PDF.", "Téléchargez votre image de signature (PNG ou JPG).", "Choisissez le numéro de page.", "Téléchargez le PDF signé."],
+ "benefits": ["Pas d'impression ni de numérisation", "Supporte PNG et JPG", "Placez sur n'importe quelle page", "Traitement sécurisé"],
+ "useCases": ["Signer des contrats électroniquement", "Ajouter des signatures d'approbation"],
+ "faq": [{"q": "Est-ce une signature électronique légale ?", "a": "Cela place une image de signature visuelle. Pour des signatures numériques juridiquement contraignantes, des solutions basées sur des certificats peuvent être nécessaires."}]
+ },
+ "cropPdf": {
+ "whatItDoes": "Rognez les pages PDF en ajustant les marges. Supprimez les espaces blancs indésirables.",
+ "howToUse": ["Téléchargez votre PDF.", "Définissez les valeurs de marge.", "Téléchargez le PDF rogné."],
+ "benefits": ["Contrôle précis des marges", "Rogner toutes les pages", "Supprimer les espaces blancs", "Gratuit et rapide"],
+ "useCases": ["Supprimer les grandes marges", "Ajuster les tailles de page"],
+ "faq": [{"q": "Quelles sont les unités des marges ?", "a": "Les marges sont spécifiées en points PDF (1 point = 1/72 pouce)."}]
+ },
+ "flattenPdf": {
+ "whatItDoes": "Aplatissez les formulaires et annotations PDF, convertissant les éléments interactifs en contenu statique.",
+ "howToUse": ["Téléchargez votre PDF avec formulaires ou annotations.", "L'outil aplatit tous les éléments interactifs.", "Téléchargez le PDF aplati."],
+ "benefits": ["Supprimer l'interactivité des formulaires", "Aplatir les annotations", "Empêcher la modification", "Idéal pour l'archivage"],
+ "useCases": ["Archiver des formulaires remplis", "Envoyer des formulaires complétés en toute sécurité"],
+ "faq": [{"q": "Que signifie aplatir ?", "a": "L'aplatissement convertit les éléments interactifs en contenu permanent non modifiable."}]
+ },
+ "repairPdf": {
+ "whatItDoes": "Réparez les fichiers PDF corrompus en réécrivant la structure du document.",
+ "howToUse": ["Téléchargez votre PDF corrompu.", "L'outil tente de réparer le document.", "Téléchargez le PDF réparé."],
+ "benefits": ["Réparer les structures PDF cassées", "Récupérer le contenu", "Sortie propre", "Gratuit"],
+ "useCases": ["Récupérer des PDF endommagés", "Réparer des fichiers qui ne s'ouvrent pas"],
+ "faq": [{"q": "Peut-il réparer n'importe quel PDF cassé ?", "a": "L'outil récupère autant de pages que possible. Les fichiers gravement corrompus peuvent n'être que partiellement récupérables."}]
+ },
+ "pdfMetadata": {
+ "whatItDoes": "Affichez et modifiez les propriétés du document PDF : titre, auteur, sujet et mots-clés.",
+ "howToUse": ["Téléchargez votre PDF.", "Remplissez les champs de métadonnées.", "Téléchargez le PDF mis à jour."],
+ "benefits": ["Modifier le titre, l'auteur et plus", "Améliorer la recherchabilité", "Nettoyer les propriétés", "Aucun logiciel nécessaire"],
+ "useCases": ["Définir des titres appropriés pour la gestion documentaire", "Ajouter des informations d'auteur"],
+ "faq": [{"q": "Que sont les métadonnées PDF ?", "a": "Les métadonnées incluent les propriétés du document comme le titre, l'auteur et les mots-clés qui aident à organiser et rechercher les PDF."}]
+ },
+ "imageCrop": {
+ "whatItDoes": "Rognez des images en spécifiant des coordonnées exactes en pixels. Supporte PNG, JPG et WebP.",
+ "howToUse": ["Téléchargez votre image.", "Entrez les coordonnées de rognage.", "Téléchargez l'image rognée."],
+ "benefits": ["Rognage précis au pixel", "Supporte PNG, JPG, WebP", "Sortie haute qualité", "Sans filigrane"],
+ "useCases": ["Rogner des photos de produits", "Supprimer les bordures indésirables"],
+ "faq": [{"q": "Comment fonctionnent les coordonnées ?", "a": "Gauche et haut définissent le point de départ, droite et bas définissent le point de fin de la zone de rognage en pixels."}]
+ },
+ "imageRotateFlip": {
+ "whatItDoes": "Faites pivoter les images de 90°, 180° ou 270° et retournez-les horizontalement ou verticalement.",
+ "howToUse": ["Téléchargez votre image.", "Choisissez l'angle de rotation et les options de retournement.", "Téléchargez l'image transformée."],
+ "benefits": ["Rotation de 90°, 180° ou 270°", "Retournement horizontal ou vertical", "Combiner les opérations", "Supporte plusieurs formats"],
+ "useCases": ["Corriger l'orientation des photos", "Créer des images miroir"],
+ "faq": [{"q": "Puis-je combiner rotation et retournement ?", "a": "Oui, la rotation et le retournement sont appliqués ensemble en une seule opération."}]
+ },
+ "barcode": {
+ "whatItDoes": "Générez des codes-barres en plusieurs formats : Code128, Code39, EAN-13, UPC-A, ISBN et plus. Téléchargez en PNG ou SVG.",
+ "howToUse": ["Entrez les données à encoder.", "Sélectionnez un type de code-barres.", "Choisissez le format de sortie (PNG ou SVG).", "Générez et téléchargez votre code-barres."],
+ "benefits": ["Plusieurs formats de code-barres", "Sortie PNG et SVG", "Génération instantanée", "Gratuit et illimité"],
+ "useCases": ["Générer des codes-barres de produits", "Créer des étiquettes d'inventaire", "Produire des codes-barres ISBN pour les livres"],
+ "faq": [
+ {"q": "Quels formats de code-barres sont disponibles ?", "a": "Code128, Code39, EAN-13, EAN-8, UPC-A, ISBN-13, ISBN-10, ISSN et PZN."},
+ {"q": "Quelle est la différence avec un code QR ?", "a": "Les codes-barres sont linéaires (1D) avec moins de capacité de données. Les codes QR sont bidimensionnels (2D) et stockent plus d'informations."}
+ ]
}
}
}
diff --git a/frontend/src/pages/AccountPage.tsx b/frontend/src/pages/AccountPage.tsx
index 844dac9..1cd90bd 100644
--- a/frontend/src/pages/AccountPage.tsx
+++ b/frontend/src/pages/AccountPage.tsx
@@ -2,6 +2,8 @@ import { useEffect, useMemo, useState, type FormEvent } from 'react';
import { Helmet } from 'react-helmet-async';
import { useTranslation } from 'react-i18next';
import {
+ AlertTriangle,
+ BarChart3,
BadgeCheck,
Check,
Copy,
@@ -33,11 +35,27 @@ const toolKeyMap: Record = {
'pdf-to-word': 'tools.pdfToWord.title',
'word-to-pdf': 'tools.wordToPdf.title',
'compress-pdf': 'tools.compressPdf.title',
+ 'compress-image': 'tools.compressImage.title',
+ 'crop-pdf': 'tools.cropPdf.title',
+ 'crop-image': 'tools.imageCrop.title',
+ 'edit-metadata': 'tools.pdfMetadata.title',
+ 'excel-to-pdf': 'tools.excelToPdf.title',
+ 'extract-pages': 'tools.extractPages.title',
+ 'extract-tables': 'tools.tableExtractor.title',
+ 'flatten-pdf': 'tools.flattenPdf.title',
+ 'html-to-pdf': 'tools.htmlToPdf.title',
'image-convert': 'tools.imageConvert.title',
+ 'image-converter': 'tools.imageConvert.title',
+ 'image-crop': 'tools.imageCrop.title',
'image-resize': 'tools.imageConvert.title',
+ 'image-rotate-flip': 'tools.imageRotateFlip.title',
'video-to-gif': 'tools.videoToGif.title',
'merge-pdf': 'tools.mergePdf.title',
+ 'ocr': 'tools.ocr.title',
'split-pdf': 'tools.splitPdf.title',
+ 'pdf-metadata': 'tools.pdfMetadata.title',
+ 'pdf-to-excel': 'tools.pdfToExcel.title',
+ 'pdf-to-pptx': 'tools.pdfToPptx.title',
'rotate-pdf': 'tools.rotatePdf.title',
'page-numbers': 'tools.pageNumbers.title',
'pdf-to-images': 'tools.pdfToImages.title',
@@ -45,8 +63,21 @@ const toolKeyMap: Record = {
'watermark-pdf': 'tools.watermarkPdf.title',
'protect-pdf': 'tools.protectPdf.title',
'unlock-pdf': 'tools.unlockPdf.title',
+ 'repair-pdf': 'tools.repairPdf.title',
+ 'remove-background': 'tools.removeBg.title',
+ 'remove-bg': 'tools.removeBg.title',
+ 'remove-watermark-pdf': 'tools.removeWatermark.title',
+ 'reorder-pdf': 'tools.reorderPdf.title',
+ 'sign-pdf': 'tools.signPdf.title',
+ 'summarize-pdf': 'tools.summarizePdf.title',
+ 'translate-pdf': 'tools.translatePdf.title',
+ 'chat-pdf': 'tools.chatPdf.title',
+ 'barcode': 'tools.barcode.title',
+ 'barcode-generator': 'tools.barcode.title',
+ 'pptx-to-pdf': 'tools.pptxToPdf.title',
'pdf-flowchart': 'tools.pdfFlowchart.title',
'pdf-flowchart-sample': 'tools.pdfFlowchart.title',
+ 'qr-code': 'tools.qrCode.title',
};
function formatHistoryTool(tool: string, t: (key: string) => string) {
@@ -93,6 +124,50 @@ export default function AccountPage() {
[i18n.language]
);
+ const dashboardMetrics = useMemo(() => {
+ const completedItems = historyItems.filter((item) => item.status === 'completed');
+ const failedItems = historyItems.filter((item) => item.status !== 'completed');
+ const toolCounts = historyItems.reduce>((acc, item) => {
+ acc[item.tool] = (acc[item.tool] || 0) + 1;
+ return acc;
+ }, {});
+
+ const favoriteToolSlug = Object.entries(toolCounts)
+ .sort((left, right) => right[1] - left[1])[0]?.[0] || null;
+
+ return {
+ totalProcessed: historyItems.length,
+ completedCount: completedItems.length,
+ failedCount: failedItems.length,
+ favoriteToolSlug,
+ successRate: historyItems.length ? Math.round((completedItems.length / historyItems.length) * 100) : 0,
+ topTools: Object.entries(toolCounts)
+ .sort((left, right) => right[1] - left[1])
+ .slice(0, 4),
+ recentFailures: failedItems.slice(0, 3),
+ onboardingItems: [
+ {
+ key: 'firstTask',
+ done: historyItems.length > 0,
+ title: t('account.onboardingFirstTaskTitle'),
+ description: t('account.onboardingFirstTaskDesc'),
+ },
+ {
+ key: 'upgrade',
+ done: user?.plan === 'pro',
+ title: t('account.onboardingUpgradeTitle'),
+ description: t('account.onboardingUpgradeDesc'),
+ },
+ {
+ key: 'apiKey',
+ done: user?.plan !== 'pro' ? false : apiKeys.some((key) => !key.revoked_at),
+ title: t('account.onboardingApiTitle'),
+ description: t('account.onboardingApiDesc'),
+ },
+ ],
+ };
+ }, [apiKeys, historyItems, t, user?.plan]);
+
useEffect(() => {
if (!user) {
setHistoryItems([]);
@@ -314,6 +389,106 @@ export default function AccountPage() {
)}
+
+
+ This area now uses the normal app session plus admin permissions. Only signed-in allowlisted admins can
+ inspect operations, edit plans, and process the support inbox.
+
+ Use an allowlisted internal account to start a normal authenticated session. Admin access is decided by
+ server-side permissions, not a client-side secret.
+
+
+
+
+
+ ) : !isAdmin ? (
+
+
No admin permission
+
+ You are signed in as {user.email}, but this account is not in the internal admin allowlist and does not
+ carry the admin role.
+
@@ -210,7 +273,7 @@ export default function PricingPage() {
{t('pages.pricing.faq3q', 'What payment methods do you accept?')}
- {t('pages.pricing.faq3a', 'We will support credit/debit cards and PayPal via Stripe. Payment integration is launching soon.')}
+ {t('pages.pricing.faq3a', 'We accept all major credit/debit cards via Stripe. Your payment information is securely processed — we never see your card details.')}