import { useMemo } from "react"; import LocalIcon from "@app/components/shared/LocalIcon"; import { useTranslation } from "react-i18next"; import SplitPdfPanel from "@app/tools/Split"; import CompressPdfPanel from "@app/tools/Compress"; import OCRPanel from "@app/tools/OCR"; import ConvertPanel from "@app/tools/Convert"; import Sanitize from "@app/tools/Sanitize"; import AddPassword from "@app/tools/AddPassword"; import ChangePermissions from "@app/tools/ChangePermissions"; import RemoveBlanks from "@app/tools/RemoveBlanks"; import RemovePages from "@app/tools/RemovePages"; import ReorganizePages from "@app/tools/ReorganizePages"; import { reorganizePagesOperationConfig } from "@app/hooks/tools/reorganizePages/useReorganizePagesOperation"; import RemovePassword from "@app/tools/RemovePassword"; import { SubcategoryId, ToolCategoryId, ToolRegistry, RegularToolRegistry, SuperToolRegistry, LinkToolRegistry, } from "@app/data/toolsTaxonomy"; import { isSuperToolId, isLinkToolId } from '@app/types/toolId'; import AdjustContrast from "@app/tools/AdjustContrast"; import AdjustContrastSingleStepSettings from "@app/components/tools/adjustContrast/AdjustContrastSingleStepSettings"; import { adjustContrastOperationConfig } from "@app/hooks/tools/adjustContrast/useAdjustContrastOperation"; import { getSynonyms } from "@app/utils/toolSynonyms"; import { useProprietaryToolRegistry } from "@app/data/useProprietaryToolRegistry"; import AddWatermark from "@app/tools/AddWatermark"; import AddStamp from "@app/tools/AddStamp"; import AddAttachments from "@app/tools/AddAttachments"; import Merge from '@app/tools/Merge'; import Repair from "@app/tools/Repair"; import AutoRename from "@app/tools/AutoRename"; import SingleLargePage from "@app/tools/SingleLargePage"; import PageLayout from "@app/tools/PageLayout"; import UnlockPdfForms from "@app/tools/UnlockPdfForms"; import RemoveCertificateSign from "@app/tools/RemoveCertificateSign"; import RemoveImage from "@app/tools/RemoveImage"; import CertSign from "@app/tools/CertSign"; import BookletImposition from "@app/tools/BookletImposition"; import Flatten from "@app/tools/Flatten"; import Rotate from "@app/tools/Rotate"; import ChangeMetadata from "@app/tools/ChangeMetadata"; import Crop from "@app/tools/Crop"; import Sign from "@app/tools/Sign"; import { compressOperationConfig } from "@app/hooks/tools/compress/useCompressOperation"; import { splitOperationConfig } from "@app/hooks/tools/split/useSplitOperation"; import { addPasswordOperationConfig } from "@app/hooks/tools/addPassword/useAddPasswordOperation"; import { removePasswordOperationConfig } from "@app/hooks/tools/removePassword/useRemovePasswordOperation"; import { sanitizeOperationConfig } from "@app/hooks/tools/sanitize/useSanitizeOperation"; import { repairOperationConfig } from "@app/hooks/tools/repair/useRepairOperation"; import { addWatermarkOperationConfig } from "@app/hooks/tools/addWatermark/useAddWatermarkOperation"; import { addStampOperationConfig } from "@app/components/tools/addStamp/useAddStampOperation"; import { addAttachmentsOperationConfig } from "@app/hooks/tools/addAttachments/useAddAttachmentsOperation"; import { unlockPdfFormsOperationConfig } from "@app/hooks/tools/unlockPdfForms/useUnlockPdfFormsOperation"; import { singleLargePageOperationConfig } from "@app/hooks/tools/singleLargePage/useSingleLargePageOperation"; import { ocrOperationConfig } from "@app/hooks/tools/ocr/useOCROperation"; import { convertOperationConfig } from "@app/hooks/tools/convert/useConvertOperation"; import { removeCertificateSignOperationConfig } from "@app/hooks/tools/removeCertificateSign/useRemoveCertificateSignOperation"; import { changePermissionsOperationConfig } from "@app/hooks/tools/changePermissions/useChangePermissionsOperation"; import { certSignOperationConfig } from "@app/hooks/tools/certSign/useCertSignOperation"; import { bookletImpositionOperationConfig } from "@app/hooks/tools/bookletImposition/useBookletImpositionOperation"; import { mergeOperationConfig } from '@app/hooks/tools/merge/useMergeOperation'; import { autoRenameOperationConfig } from "@app/hooks/tools/autoRename/useAutoRenameOperation"; import { flattenOperationConfig } from "@app/hooks/tools/flatten/useFlattenOperation"; import { redactOperationConfig } from "@app/hooks/tools/redact/useRedactOperation"; import { rotateOperationConfig } from "@app/hooks/tools/rotate/useRotateOperation"; import { changeMetadataOperationConfig } from "@app/hooks/tools/changeMetadata/useChangeMetadataOperation"; import { signOperationConfig } from "@app/hooks/tools/sign/useSignOperation"; import { cropOperationConfig } from "@app/hooks/tools/crop/useCropOperation"; import { removeAnnotationsOperationConfig } from "@app/hooks/tools/removeAnnotations/useRemoveAnnotationsOperation"; import { extractImagesOperationConfig } from "@app/hooks/tools/extractImages/useExtractImagesOperation"; import { replaceColorOperationConfig } from "@app/hooks/tools/replaceColor/useReplaceColorOperation"; import { removePagesOperationConfig } from "@app/hooks/tools/removePages/useRemovePagesOperation"; import { removeBlanksOperationConfig } from "@app/hooks/tools/removeBlanks/useRemoveBlanksOperation"; import { overlayPdfsOperationConfig } from "@app/hooks/tools/overlayPdfs/useOverlayPdfsOperation"; import { adjustPageScaleOperationConfig } from "@app/hooks/tools/adjustPageScale/useAdjustPageScaleOperation"; import { scannerImageSplitOperationConfig } from "@app/hooks/tools/scannerImageSplit/useScannerImageSplitOperation"; import { addPageNumbersOperationConfig } from "@app/components/tools/addPageNumbers/useAddPageNumbersOperation"; import CompressSettings from "@app/components/tools/compress/CompressSettings"; import AddPasswordSettings from "@app/components/tools/addPassword/AddPasswordSettings"; import RemovePasswordSettings from "@app/components/tools/removePassword/RemovePasswordSettings"; import SanitizeSettings from "@app/components/tools/sanitize/SanitizeSettings"; import AddWatermarkSingleStepSettings from "@app/components/tools/addWatermark/AddWatermarkSingleStepSettings"; import OCRSettings from "@app/components/tools/ocr/OCRSettings"; import ConvertSettings from "@app/components/tools/convert/ConvertSettings"; import ChangePermissionsSettings from "@app/components/tools/changePermissions/ChangePermissionsSettings"; import BookletImpositionSettings from "@app/components/tools/bookletImposition/BookletImpositionSettings"; import FlattenSettings from "@app/components/tools/flatten/FlattenSettings"; import RedactSingleStepSettings from "@app/components/tools/redact/RedactSingleStepSettings"; import Redact from "@app/tools/Redact"; import AdjustPageScale from "@app/tools/AdjustPageScale"; import ReplaceColor from "@app/tools/ReplaceColor"; import ScannerImageSplit from "@app/tools/ScannerImageSplit"; import OverlayPdfs from "@app/tools/OverlayPdfs"; import { ToolId } from "@app/types/toolId"; import MergeSettings from '@app/components/tools/merge/MergeSettings'; import AdjustPageScaleSettings from "@app/components/tools/adjustPageScale/AdjustPageScaleSettings"; import ScannerImageSplitSettings from "@app/components/tools/scannerImageSplit/ScannerImageSplitSettings"; import ChangeMetadataSingleStep from "@app/components/tools/changeMetadata/ChangeMetadataSingleStep"; import SignSettings from "@app/components/tools/sign/SignSettings"; import AddPageNumbers from "@app/tools/AddPageNumbers"; import RemoveAnnotations from "@app/tools/RemoveAnnotations"; import PageLayoutSettings from "@app/components/tools/pageLayout/PageLayoutSettings"; import ExtractImages from "@app/tools/ExtractImages"; import ExtractImagesSettings from "@app/components/tools/extractImages/ExtractImagesSettings"; import ReplaceColorSettings from "@app/components/tools/replaceColor/ReplaceColorSettings"; import AddStampAutomationSettings from "@app/components/tools/addStamp/AddStampAutomationSettings"; import CertSignAutomationSettings from "@app/components/tools/certSign/CertSignAutomationSettings"; import CropAutomationSettings from "@app/components/tools/crop/CropAutomationSettings"; import RotateAutomationSettings from "@app/components/tools/rotate/RotateAutomationSettings"; import SplitAutomationSettings from "@app/components/tools/split/SplitAutomationSettings"; import AddAttachmentsSettings from "@app/components/tools/addAttachments/AddAttachmentsSettings"; import RemovePagesSettings from "@app/components/tools/removePages/RemovePagesSettings"; import RemoveBlanksSettings from "@app/components/tools/removeBlanks/RemoveBlanksSettings"; import AddPageNumbersAutomationSettings from "@app/components/tools/addPageNumbers/AddPageNumbersAutomationSettings"; import OverlayPdfsSettings from "@app/components/tools/overlayPdfs/OverlayPdfsSettings"; import ValidateSignature from "@app/tools/ValidateSignature"; import Automate from "@app/tools/Automate"; import { CONVERT_SUPPORTED_FORMATS } from "@app/constants/convertSupportedFornats"; export interface TranslatedToolCatalog { allTools: ToolRegistry; regularTools: RegularToolRegistry; superTools: SuperToolRegistry; linkTools: LinkToolRegistry; } // Hook to get the translated tool registry export function useTranslatedToolCatalog(): TranslatedToolCatalog { const { t } = useTranslation(); const proprietaryTools = useProprietaryToolRegistry(); return useMemo(() => { const allTools: ToolRegistry = { // Proprietary tools (if any) ...proprietaryTools, // Recommended Tools in order multiTool: { icon: , name: t("home.multiTool.title", "Multi-Tool"), component: null, workbench: "pageEditor", description: t("home.multiTool.desc", "Use multiple tools on a single PDF document"), categoryId: ToolCategoryId.RECOMMENDED_TOOLS, subcategoryId: SubcategoryId.GENERAL, maxFiles: -1, synonyms: getSynonyms(t, "multiTool"), supportsAutomate: false, automationSettings: null }, merge: { icon: , name: t("home.merge.title", "Merge"), component: Merge, description: t("home.merge.desc", "Merge multiple PDFs into a single document"), categoryId: ToolCategoryId.RECOMMENDED_TOOLS, subcategoryId: SubcategoryId.GENERAL, maxFiles: -1, endpoints: ["merge-pdfs"], operationConfig: mergeOperationConfig, automationSettings: MergeSettings, synonyms: getSynonyms(t, "merge") }, // Signing certSign: { icon: , name: t("home.certSign.title", "Certificate Sign"), component: CertSign, description: t("home.certSign.desc", "Sign PDF documents using digital certificates"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.SIGNING, synonyms: getSynonyms(t, "certSign"), maxFiles: -1, endpoints: ["cert-sign"], operationConfig: certSignOperationConfig, automationSettings: CertSignAutomationSettings, }, sign: { icon: , name: t("home.sign.title", "Sign"), component: Sign, description: t("home.sign.desc", "Adds signature to PDF by drawing, text or image"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.SIGNING, operationConfig: signOperationConfig, automationSettings: SignSettings, // TODO:: not all settings shown, suggested next tools shown synonyms: getSynonyms(t, "sign"), supportsAutomate: false, //TODO make support Sign }, // Document Security addPassword: { icon: , name: t("home.addPassword.title", "Add Password"), component: AddPassword, description: t("home.addPassword.desc", "Add password protection and restrictions to PDF files"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.DOCUMENT_SECURITY, maxFiles: -1, endpoints: ["add-password"], operationConfig: addPasswordOperationConfig, automationSettings: AddPasswordSettings, synonyms: getSynonyms(t, "addPassword") }, watermark: { icon: , name: t("home.watermark.title", "Add Watermark"), component: AddWatermark, maxFiles: -1, description: t("home.watermark.desc", "Add a custom watermark to your PDF document."), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.DOCUMENT_SECURITY, endpoints: ["add-watermark"], operationConfig: addWatermarkOperationConfig, automationSettings: AddWatermarkSingleStepSettings, synonyms: getSynonyms(t, "watermark") }, addStamp: { icon: , name: t("home.addStamp.title", "Add Stamp to PDF"), component: AddStamp, description: t("home.addStamp.desc", "Add text or add image stamps at set locations"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.DOCUMENT_SECURITY, synonyms: getSynonyms(t, "addStamp"), maxFiles: -1, endpoints: ["add-stamp"], operationConfig: addStampOperationConfig, automationSettings: AddStampAutomationSettings, }, sanitize: { icon: , name: t("home.sanitize.title", "Sanitize"), component: Sanitize, maxFiles: -1, categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.DOCUMENT_SECURITY, description: t("home.sanitize.desc", "Remove potentially harmful elements from PDF files"), endpoints: ["sanitize-pdf"], operationConfig: sanitizeOperationConfig, automationSettings: SanitizeSettings, synonyms: getSynonyms(t, "sanitize") }, flatten: { icon: , name: t("home.flatten.title", "Flatten"), component: Flatten, description: t("home.flatten.desc", "Remove all interactive elements and forms from a PDF"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.DOCUMENT_SECURITY, maxFiles: -1, endpoints: ["flatten"], operationConfig: flattenOperationConfig, automationSettings: FlattenSettings, synonyms: getSynonyms(t, "flatten") }, unlockPDFForms: { icon: , name: t("home.unlockPDFForms.title", "Unlock PDF Forms"), component: UnlockPdfForms, description: t("home.unlockPDFForms.desc", "Remove read-only property of form fields in a PDF document."), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.DOCUMENT_SECURITY, maxFiles: -1, endpoints: ["unlock-pdf-forms"], operationConfig: unlockPdfFormsOperationConfig, synonyms: getSynonyms(t, "unlockPDFForms"), automationSettings: null }, changePermissions: { icon: , name: t("home.changePermissions.title", "Change Permissions"), component: ChangePermissions, description: t("home.changePermissions.desc", "Change document restrictions and permissions"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.DOCUMENT_SECURITY, maxFiles: -1, endpoints: ["add-password"], operationConfig: changePermissionsOperationConfig, automationSettings: ChangePermissionsSettings, synonyms: getSynonyms(t, "changePermissions"), }, getPdfInfo: { icon: , name: t("home.getPdfInfo.title", "Get ALL Info on PDF"), component: null, description: t("home.getPdfInfo.desc", "Grabs any and all information possible on PDFs"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.VERIFICATION, synonyms: getSynonyms(t, "getPdfInfo"), supportsAutomate: false, automationSettings: null }, validateSignature: { icon: , name: t("home.validateSignature.title", "Validate PDF Signature"), component: ValidateSignature, description: t("home.validateSignature.desc", "Verify digital signatures and certificates in PDF documents"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.VERIFICATION, maxFiles: -1, endpoints: ["validate-signature"], synonyms: getSynonyms(t, "validateSignature"), automationSettings: null }, // Document Review read: { icon: , name: t("home.read.title", "Read"), component: null, workbench: "viewer", description: t( "home.read.desc", "View and annotate PDFs. Highlight text, draw, or insert comments for review and collaboration." ), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.DOCUMENT_REVIEW, synonyms: getSynonyms(t, "read"), supportsAutomate: false, automationSettings: null }, changeMetadata: { icon: , name: t("home.changeMetadata.title", "Change Metadata"), component: ChangeMetadata, description: t("home.changeMetadata.desc", "Change/Remove/Add metadata from a PDF document"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.DOCUMENT_REVIEW, maxFiles: -1, endpoints: ["update-metadata"], operationConfig: changeMetadataOperationConfig, automationSettings: ChangeMetadataSingleStep, synonyms: getSynonyms(t, "changeMetadata") }, // Page Formatting crop: { icon: , name: t("home.crop.title", "Crop PDF"), component: Crop, description: t("home.crop.desc", "Crop a PDF to reduce its size (maintains text!)"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, maxFiles: -1, endpoints: ["crop"], operationConfig: cropOperationConfig, automationSettings: CropAutomationSettings, }, rotate: { icon: , name: t("home.rotate.title", "Rotate"), component: Rotate, description: t("home.rotate.desc", "Easily rotate your PDFs."), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, maxFiles: -1, endpoints: ["rotate-pdf"], operationConfig: rotateOperationConfig, automationSettings: RotateAutomationSettings, synonyms: getSynonyms(t, "rotate") }, split: { icon: , name: t("home.split.title", "Split"), component: SplitPdfPanel, description: t("home.split.desc", "Split PDFs into multiple documents"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, operationConfig: splitOperationConfig, automationSettings: SplitAutomationSettings, synonyms: getSynonyms(t, "split") }, reorganizePages: { icon: , name: t("home.reorganizePages.title", "Reorganize Pages"), component: ReorganizePages, description: t( "home.reorganizePages.desc", "Rearrange, duplicate, or delete PDF pages with visual drag-and-drop control." ), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, endpoints: ["rearrange-pages"], operationConfig: reorganizePagesOperationConfig, synonyms: getSynonyms(t, "reorganizePages"), automationSettings: null }, scalePages: { icon: , name: t("home.scalePages.title", "Adjust page size/scale"), component: AdjustPageScale, description: t("home.scalePages.desc", "Change the size/scale of a page and/or its contents."), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, maxFiles: -1, endpoints: ["scale-pages"], operationConfig: adjustPageScaleOperationConfig, automationSettings: AdjustPageScaleSettings, synonyms: getSynonyms(t, "scalePages") }, addPageNumbers: { icon: , name: t("home.addPageNumbers.title", "Add Page Numbers"), component: AddPageNumbers, description: t("home.addPageNumbers.desc", "Add Page numbers throughout a document in a set location"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, automationSettings: AddPageNumbersAutomationSettings, maxFiles: -1, endpoints: ["add-page-numbers"], operationConfig: addPageNumbersOperationConfig, synonyms: getSynonyms(t, "addPageNumbers") }, pageLayout: { icon: , name: t("home.pageLayout.title", "Multi-Page Layout"), component: PageLayout, description: t("home.pageLayout.desc", "Merge multiple pages of a PDF document into a single page"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, maxFiles: -1, endpoints: ["multi-page-layout"], automationSettings: PageLayoutSettings, synonyms: getSynonyms(t, "pageLayout") }, bookletImposition: { icon: , name: t("home.bookletImposition.title", "Booklet Imposition"), component: BookletImposition, operationConfig: bookletImpositionOperationConfig, automationSettings: BookletImpositionSettings, description: t("home.bookletImposition.desc", "Create booklets with proper page ordering and multi-page layout for printing and binding"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, }, pdfToSinglePage: { icon: , name: t("home.pdfToSinglePage.title", "PDF to Single Large Page"), component: SingleLargePage, description: t("home.pdfToSinglePage.desc", "Merges all PDF pages into one large single page"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, maxFiles: -1, endpoints: ["pdf-to-single-page"], operationConfig: singleLargePageOperationConfig, synonyms: getSynonyms(t, "pdfToSinglePage"), automationSettings: null, }, addAttachments: { icon: , name: t("home.addAttachments.title", "Add Attachments"), component: AddAttachments, description: t("home.addAttachments.desc", "Add or remove embedded files (attachments) to/from a PDF"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.PAGE_FORMATTING, synonyms: getSynonyms(t, "addAttachments"), maxFiles: 1, endpoints: ["add-attachments"], operationConfig: addAttachmentsOperationConfig, automationSettings: AddAttachmentsSettings, }, // Extraction extractPages: { icon: , name: t("home.extractPages.title", "Extract Pages"), component: null, description: t("home.extractPages.desc", "Extract specific pages from a PDF document"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.EXTRACTION, synonyms: getSynonyms(t, "extractPages"), automationSettings: null, }, extractImages: { icon: , name: t("home.extractImages.title", "Extract Images"), component: ExtractImages, description: t("home.extractImages.desc", "Extract images from PDF documents"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.EXTRACTION, maxFiles: -1, endpoints: ["extract-images"], operationConfig: extractImagesOperationConfig, automationSettings: ExtractImagesSettings, synonyms: getSynonyms(t, "extractImages") }, // Removal removePages: { icon: , name: t("home.removePages.title", "Remove Pages"), component: RemovePages, description: t("home.removePages.desc", "Remove specific pages from a PDF document"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.REMOVAL, maxFiles: 1, endpoints: ["remove-pages"], synonyms: getSynonyms(t, "removePages"), operationConfig: removePagesOperationConfig, automationSettings: RemovePagesSettings, }, removeBlanks: { icon: , name: t("home.removeBlanks.title", "Remove Blank Pages"), component: RemoveBlanks, description: t("home.removeBlanks.desc", "Remove blank pages from PDF documents"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.REMOVAL, maxFiles: 1, endpoints: ["remove-blanks"], synonyms: getSynonyms(t, "removeBlanks"), operationConfig: removeBlanksOperationConfig, automationSettings: RemoveBlanksSettings, }, removeAnnotations: { icon: , name: t("home.removeAnnotations.title", "Remove Annotations"), component: RemoveAnnotations, description: t("home.removeAnnotations.desc", "Remove annotations and comments from PDF documents"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.REMOVAL, maxFiles: -1, operationConfig: removeAnnotationsOperationConfig, automationSettings: null, synonyms: getSynonyms(t, "removeAnnotations") }, removeImage: { icon: , name: t("home.removeImage.title", "Remove Images"), component: RemoveImage, description: t("home.removeImage.desc", "Remove all images from a PDF document"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.REMOVAL, maxFiles: -1, endpoints: ["remove-image-pdf"], operationConfig: undefined, synonyms: getSynonyms(t, "removeImage"), automationSettings: null, }, removePassword: { icon: , name: t("home.removePassword.title", "Remove Password"), component: RemovePassword, description: t("home.removePassword.desc", "Remove password protection from PDF documents"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.REMOVAL, endpoints: ["remove-password"], maxFiles: -1, operationConfig: removePasswordOperationConfig, automationSettings: RemovePasswordSettings, synonyms: getSynonyms(t, "removePassword") }, removeCertSign: { icon: , name: t("home.removeCertSign.title", "Remove Certificate Sign"), component: RemoveCertificateSign, description: t("home.removeCertSign.desc", "Remove digital signature from PDF documents"), categoryId: ToolCategoryId.STANDARD_TOOLS, subcategoryId: SubcategoryId.REMOVAL, maxFiles: -1, endpoints: ["remove-certificate-sign"], operationConfig: removeCertificateSignOperationConfig, synonyms: getSynonyms(t, "removeCertSign"), automationSettings: null, }, // Automation automate: { icon: , name: t("home.automate.title", "Automate"), component: Automate, description: t( "home.automate.desc", "Build multi-step workflows by chaining together PDF actions. Ideal for recurring tasks." ), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.AUTOMATION, maxFiles: -1, supportedFormats: CONVERT_SUPPORTED_FORMATS, endpoints: ["handleData"], synonyms: getSynonyms(t, "automate"), automationSettings: null, }, autoRename: { icon: , name: t("home.autoRename.title", "Auto Rename PDF File"), component: AutoRename, maxFiles: -1, endpoints: ["remove-certificate-sign"], operationConfig: autoRenameOperationConfig, description: t("home.autoRename.desc", "Automatically rename PDF files based on their content"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.AUTOMATION, synonyms: getSynonyms(t, "autoRename"), automationSettings: null, }, // Advanced Formatting adjustContrast: { icon: , name: t("home.adjustContrast.title", "Adjust Colors/Contrast"), component: AdjustContrast, description: t("home.adjustContrast.desc", "Adjust colors and contrast of PDF documents"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.ADVANCED_FORMATTING, operationConfig: adjustContrastOperationConfig, automationSettings: AdjustContrastSingleStepSettings, synonyms: getSynonyms(t, "adjustContrast"), }, repair: { icon: , name: t("home.repair.title", "Repair"), component: Repair, description: t("home.repair.desc", "Repair corrupted or damaged PDF files"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.ADVANCED_FORMATTING, maxFiles: -1, endpoints: ["repair"], operationConfig: repairOperationConfig, synonyms: getSynonyms(t, "repair"), automationSettings: null }, scannerImageSplit: { icon: , name: t("home.scannerImageSplit.title", "Detect & Split Scanned Photos"), component: ScannerImageSplit, description: t("home.scannerImageSplit.desc", "Detect and split scanned photos into separate pages"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.ADVANCED_FORMATTING, maxFiles: -1, endpoints: ["extract-image-scans"], operationConfig: scannerImageSplitOperationConfig, automationSettings: ScannerImageSplitSettings, synonyms: getSynonyms(t, "ScannerImageSplit"), }, overlayPdfs: { icon: , name: t("home.overlay-pdfs.title", "Overlay PDFs"), component: OverlayPdfs, description: t("home.overlay-pdfs.desc", "Overlay one PDF on top of another"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.ADVANCED_FORMATTING, operationConfig: overlayPdfsOperationConfig, synonyms: getSynonyms(t, "overlay-pdfs"), automationSettings: OverlayPdfsSettings }, replaceColor: { icon: , name: t("home.replaceColor.title", "Replace & Invert Color"), component: ReplaceColor, description: t("home.replaceColor.desc", "Replace or invert colors in PDF documents"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.ADVANCED_FORMATTING, maxFiles: -1, endpoints: ["replace-invert-pdf"], operationConfig: replaceColorOperationConfig, automationSettings: ReplaceColorSettings, synonyms: getSynonyms(t, "replaceColor"), }, addImage: { icon: , name: t("home.addImage.title", "Add Image"), component: null, description: t("home.addImage.desc", "Add images to PDF documents"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.ADVANCED_FORMATTING, synonyms: getSynonyms(t, "addImage"), automationSettings: null }, editTableOfContents: { icon: , name: t("home.editTableOfContents.title", "Edit Table of Contents"), component: null, description: t("home.editTableOfContents.desc", "Add or edit bookmarks and table of contents in PDF documents"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.ADVANCED_FORMATTING, synonyms: getSynonyms(t, "editTableOfContents"), automationSettings: null }, scannerEffect: { icon: , name: t("home.scannerEffect.title", "Scanner Effect"), component: null, description: t("home.scannerEffect.desc", "Create a PDF that looks like it was scanned"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.ADVANCED_FORMATTING, synonyms: getSynonyms(t, "scannerEffect"), automationSettings: null }, // Developer Tools showJS: { icon: , name: t("home.showJS.title", "Show JavaScript"), component: null, description: t("home.showJS.desc", "Extract and display JavaScript code from PDF documents"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.DEVELOPER_TOOLS, synonyms: getSynonyms(t, "showJS"), supportsAutomate: false, automationSettings: null }, devApi: { icon: , name: t("home.devApi.title", "API"), component: null, description: t("home.devApi.desc", "Link to API documentation"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.DEVELOPER_TOOLS, link: "https://stirlingpdf.io/swagger-ui/5.21.0/index.html", synonyms: getSynonyms(t, "devApi"), supportsAutomate: false, automationSettings: null }, devFolderScanning: { icon: , name: t("home.devFolderScanning.title", "Automated Folder Scanning"), component: null, description: t("home.devFolderScanning.desc", "Link to automated folder scanning guide"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.DEVELOPER_TOOLS, link: "https://docs.stirlingpdf.com/Advanced%20Configuration/Folder%20Scanning/", synonyms: getSynonyms(t, "devFolderScanning"), supportsAutomate: false, automationSettings: null }, devSsoGuide: { icon: , name: t("home.devSsoGuide.title", "SSO Guide"), component: null, description: t("home.devSsoGuide.desc", "Link to SSO guide"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.DEVELOPER_TOOLS, link: "https://docs.stirlingpdf.com/Advanced%20Configuration/Single%20Sign-On%20Configuration", synonyms: getSynonyms(t, "devSsoGuide"), supportsAutomate: false, automationSettings: null }, devAirgapped: { icon: , name: t("home.devAirgapped.title", "Air-gapped Setup"), component: null, description: t("home.devAirgapped.desc", "Link to air-gapped setup guide"), categoryId: ToolCategoryId.ADVANCED_TOOLS, subcategoryId: SubcategoryId.DEVELOPER_TOOLS, link: "https://docs.stirlingpdf.com/Pro/#activation", synonyms: getSynonyms(t, "devAirgapped"), supportsAutomate: false, automationSettings: null }, // Recommended Tools compare: { icon: , name: t("home.compare.title", "Compare"), component: null, description: t("home.compare.desc", "Compare two PDF documents and highlight differences"), categoryId: ToolCategoryId.STANDARD_TOOLS /* TODO: Change to RECOMMENDED_TOOLS when component is implemented */, subcategoryId: SubcategoryId.GENERAL, synonyms: getSynonyms(t, "compare"), supportsAutomate: false, automationSettings: null }, compress: { icon: , name: t("home.compress.title", "Compress"), component: CompressPdfPanel, description: t("home.compress.desc", "Compress PDFs to reduce their file size."), categoryId: ToolCategoryId.RECOMMENDED_TOOLS, subcategoryId: SubcategoryId.GENERAL, maxFiles: -1, operationConfig: compressOperationConfig, automationSettings: CompressSettings, synonyms: getSynonyms(t, "compress") }, convert: { icon: , name: t("home.convert.title", "Convert"), component: ConvertPanel, description: t("home.convert.desc", "Convert files to and from PDF format"), categoryId: ToolCategoryId.RECOMMENDED_TOOLS, subcategoryId: SubcategoryId.GENERAL, maxFiles: -1, supportedFormats: CONVERT_SUPPORTED_FORMATS, endpoints: [ "pdf-to-img", "img-to-pdf", "pdf-to-word", "pdf-to-presentation", "pdf-to-text", "pdf-to-html", "pdf-to-xml", "html-to-pdf", "markdown-to-pdf", "file-to-pdf", "pdf-to-csv", "pdf-to-markdown", "pdf-to-pdfa", "eml-to-pdf", ], operationConfig: convertOperationConfig, automationSettings: ConvertSettings, synonyms: getSynonyms(t, "convert") }, ocr: { icon: , name: t("home.ocr.title", "OCR"), component: OCRPanel, description: t("home.ocr.desc", "Extract text from scanned PDFs using Optical Character Recognition"), categoryId: ToolCategoryId.RECOMMENDED_TOOLS, subcategoryId: SubcategoryId.GENERAL, maxFiles: -1, operationConfig: ocrOperationConfig, automationSettings: OCRSettings, synonyms: getSynonyms(t, "ocr") }, redact: { icon: , name: t("home.redact.title", "Redact"), component: Redact, description: t("home.redact.desc", "Permanently remove sensitive information from PDF documents"), categoryId: ToolCategoryId.RECOMMENDED_TOOLS, subcategoryId: SubcategoryId.GENERAL, maxFiles: -1, endpoints: ["auto-redact"], operationConfig: redactOperationConfig, automationSettings: RedactSingleStepSettings, synonyms: getSynonyms(t, "redact") }, }; const regularTools = {} as RegularToolRegistry; const superTools = {} as SuperToolRegistry; const linkTools = {} as LinkToolRegistry; Object.entries(allTools).forEach(([key, entry]) => { const toolId = key as ToolId; if (isSuperToolId(toolId)) { superTools[toolId] = entry; } else if (isLinkToolId(toolId)) { linkTools[toolId] = entry; } else { regularTools[toolId] = entry; } }); return { allTools, regularTools, superTools, linkTools, }; }, [t, proprietaryTools]); // Re-compute when translations or proprietary tools change }