11import { useState , useRef } from "react" ;
2+ import { useTranslation } from "react-i18next" ;
23import * as ort from "onnxruntime-web" ;
34import * as pdfjsLib from "pdfjs-dist" ;
45import { detectFormFields } from "./lib/formFieldDetection" ;
@@ -45,6 +46,7 @@ interface PdfFileState {
4546}
4647
4748export function FormFieldsDetection ( ) {
49+ const { t } = useTranslation ( ) ;
4850 const [ pdfFile , setPdfFile ] = useState < PdfFileState | null > ( null ) ;
4951 const [ modelConfiguration , setModelConfiguration ] =
5052 useState < ModelConfiguration > ( {
@@ -62,17 +64,41 @@ export function FormFieldsDetection() {
6264 const file = event . target . files ?. [ 0 ] ;
6365
6466 if ( ! file || file . type !== "application/pdf" ) {
65- setStatus ( { type : "error" , message : "Please select a valid PDF file" } ) ;
67+ setStatus ( { type : "error" , message : t ( "errors.invalidPdfFile" ) } ) ;
6668 return ;
6769 }
6870
6971 const validationResult = await ensureValidPDF ( file ) ;
7072
7173 if ( ! validationResult . success ) {
72- setStatus ( {
73- type : "error" ,
74- message : validationResult . error . message ,
75- } ) ;
74+ const errorCode = validationResult . error . code ;
75+
76+ if ( errorCode === "pdf_encrypted_or_malformed" ) {
77+ setStatus ( {
78+ type : "error" ,
79+ message : (
80+ < >
81+ { t ( "errors.pdfEncryptedOrMalformed" ) } { " " }
82+ < a
83+ href = "https://tools.pdf24.org/en/pdf-to-pdfa"
84+ target = "_blank"
85+ rel = "noopener noreferrer"
86+ className = "underline hover:text-red-900"
87+ >
88+ tools.pdf24.org
89+ </ a > { " " }
90+ { t ( "errors.pdfEncryptedNotAffiliated" ) }
91+ </ >
92+ ) ,
93+ } ) ;
94+ } else {
95+ setStatus ( {
96+ type : "error" ,
97+ message : t ( "errors.pdfProcessingFailed" , {
98+ errorMessage : validationResult . error . errorMessage || "Unknown error" ,
99+ } ) ,
100+ } ) ;
101+ }
76102 return ;
77103 }
78104
@@ -84,7 +110,9 @@ export function FormFieldsDetection() {
84110 if ( validationResult . data . warning ) {
85111 setStatus ( {
86112 type : "warning" ,
87- message : validationResult . data . warning . message ,
113+ message : t ( "warnings.pdfHasAcrofields" , {
114+ count : validationResult . data . warning . fieldsCount ,
115+ } ) ,
88116 } ) ;
89117 } else {
90118 setStatus ( { type : "idle" } ) ;
@@ -102,20 +130,38 @@ export function FormFieldsDetection() {
102130 pdfFile : pdfFile . file ,
103131 modelPath : MODEL_URLS [ modelConfiguration . selectedModel ] ,
104132 confidenceThreshold : modelConfiguration . confidenceThreshold ,
105- onUpdateDetectionStatus : ( message ) => {
106- setStatus ( { type : "loading" , message } ) ;
133+ onUpdateDetectionStatus : ( status ) => {
134+ const translatedMessage = ( ( ) : string => {
135+ switch ( status . type ) {
136+ case "loading_pdf" :
137+ return t ( "statusMessages.loadingPdf" ) ;
138+ case "running_detection" :
139+ return t ( "statusMessages.runningDetection" , {
140+ modelName : status . modelName ,
141+ } ) ;
142+ case "processing_page" :
143+ return t ( "statusMessages.processingPage" , {
144+ current : status . current ,
145+ total : status . total ,
146+ } ) ;
147+ }
148+ } ) ( ) ;
149+
150+ setStatus ( { type : "loading" , message : translatedMessage } ) ;
107151 } ,
108152 } ) ;
109153
110154 if ( ! detectionResult . success ) {
111155 setStatus ( {
112156 type : "error" ,
113- message : detectionResult . error . message ,
157+ message : t ( "errors.detectionFailed" , {
158+ errorMessage : detectionResult . error . message ,
159+ } ) ,
114160 } ) ;
115161 return ;
116162 }
117163
118- setStatus ( { type : "loading" , message : "Applying AcroFields to PDF..." } ) ;
164+ setStatus ( { type : "loading" , message : t ( "statusMessages.applyingAcroFields" ) } ) ;
119165
120166 const acroFieldsResult = await applyAcroFields ( {
121167 pdfFile : pdfFile . file ,
@@ -126,7 +172,9 @@ export function FormFieldsDetection() {
126172 if ( ! acroFieldsResult . success ) {
127173 setStatus ( {
128174 type : "error" ,
129- message : acroFieldsResult . error . message ,
175+ message : t ( "errors.acroFieldsFailed" , {
176+ errorMessage : acroFieldsResult . error . message ,
177+ } ) ,
130178 } ) ;
131179 return ;
132180 }
0 commit comments